gpt4 book ai didi

c# - 将 ComboBox DataSource 设置为枚举并绑定(bind) SelectedValue

转载 作者:行者123 更新时间:2023-12-05 08:57:26 33 4
gpt4 key购买 nike

我有点绝望,因为昨天它还在工作,但今天它不再工作了,让我解释一下,我想做什么:

我想将 ComboBoxDataSource 设置为特定枚举中的所有枚举值。就这样:

cmbType.DataSource = m_addViewPresenter.Types;

其中 Types 是一个 BindingList 并像这样被初始化:

public BindingList<MyEnum> Types
{
get { return m_types; }
set
{
m_types = value;
OnPropertyChanged();
}
}

[ImportingConstructor]
public AddViewPresenter()
{
Types = new BindingList<MyEnum>(
Enum.GetValues(typeof(MyEnum))
.Cast<MyEnum>().ToList());
}

此外,我想将当前选择的项目绑定(bind)到一个属性。由于 ComboBox.SelectedItem 不会触发 INotifyProperty 事件,因此我正在使用 ComboBox.SelectedValue

cmbType.Bind(m_addViewPresenter, c => c.SelectedValue, m => m.SelectedValue);

public static void Bind<TComponent, T>(
this TComponent component, T value,
Expression<Func<TComponent, object>> controlProperty,
Expression<Func<T, object>> modelProperty)
where TComponent : IBindableComponent
where T : INotifyPropertyChanged
{
var controlPropertyName = PropertyNameResolver.GetPropertyName(controlProperty);
var modelPropertyName = PropertyNameResolver.GetPropertyName(modelProperty);
component.DataBindings.Add(new Binding(controlPropertyName, value, modelPropertyName, false, DataSourceUpdateMode.OnPropertyChanged));
}

昨天工作正常,但有些事情搞砸了,今天我只得到一个 InvalidOperationException:

Cannot set the SelectedValue in a ListControl with an empty ValueMember.

我知道这是在黑暗中挖掘,但任何人都可以和我一起集思广益,找出问题所在吗?提前致谢!

最佳答案

选项 1

使用SelectedValue对于数据绑定(bind),创建一个 calss DataItem:

public class DataItem
{
public MyEnum Value { get; set; }
public string Text { get; set; }
}

然后使用这段代码进行数据绑定(bind):

this.comboBox1.DataSource = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>()
.Select(x => new DataItem() { Value = x, Text = x.ToString() })
.ToList();
this.comboBox1.ValueMember = "Value";
this.comboBox1.DisplayMember = "Text";

this.comboBox1.DataBindings.Add(
new Binding("SelectedValue", yourObjectToBind, "PropertyOfYourObject"));

您可以制作通用的 DataItem<T>包含 public T Value { get; set; }使其在您的项目中更具可重用性。

选项 2

使用SelectedItem用于数据绑定(bind):

this.comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));
this.comboBox1.DataBindings.Add(
new Binding("SelectedItem", yourObjectToBind, "PropertyOfYourObject"));

选项 3

使用SelectedValue对于数据绑定(bind)作为 Ivan Stoev 建议的另一种选择,您可以通过这种方式执行数据绑定(bind):

this.comboBox1.DataSource = Enum.GetValues(typeof(MyEnum));
this.comboBox1.DataBindings.Add(
new Binding("SelectedValue", yourObjectToBind, "PropertyOfYourObject",
true, DataSourceUpdateMode.OnPropertyChanged));

Jannik 编辑:

选项 1 的基本通用方法如下所示:

public class ComboBoxItemWrapper<T>
{
public T Value { get; set; }
public string Text { get; set; }
}

关于c# - 将 ComboBox DataSource 设置为枚举并绑定(bind) SelectedValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32997985/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com