【发布时间】:2015-10-07 16:47:20
【问题描述】:
我有点绝望,因为昨天它还在工作,但今天它不再工作了,让我解释一下,我想要做什么:
我想将ComboBox 的DataSource 设置为特定枚举中的所有枚举值。就这样:
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());
}
此外,我想将当前选定的项目绑定到一个属性。由于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:
无法在 ListControl 中将 SelectedValue 设置为空 价值成员。
我知道它是在黑暗中挖掘,但是任何人都可以和我一起集思广益,找出问题所在吗?提前致谢!
【问题讨论】:
-
看起来绑定到
ComboBox.SelectedValue需要设置'ComboBox.ValueMember` -
你真的应该绑定到
ComboBox.SelectedItem,我不知道你为什么认为它不会触发属性更改通知,我认为它确实如此。 -
我用 cmbType.Bind(m_addViewPresenter, c => c.SelectedValue, m => m.SelectedValue); 进行了尝试,但它没有进入 setter。 ://
-
@Jannik 要将数据绑定到
SelectedValue,请使用另一个包含DisplayMember属性和ValueMember属性的类,并将您的枚举值调整为List<ThatClass>@987654337 @,或者只是将您的枚举值用作数据源并绑定到SelectedItem,正如 Ivan 所提到的那样。 -
就像我告诉你的那样,绑定 SelectedItem 不会进入 SelectedValue 的设置器,它不起作用。
标签: c# winforms data-binding combobox