我有一个组合框,它绑定到一个集合,本质上是一个名称/值对列表。集合可以有多个名称不同的项,但值可以是相同的。
public class NameValuePair
{
public string Name { get; set; }
public string Value { get; set; }
}
public class NameValuePairCollection : List<NameValuePair>
{
public NameValuePairCollection(): base() { }
}
在我的User Control中我有一个私有字段items它是NameValuePair集合的一个实例
private NameValuePairCollection items = new NameValuePairCollection()
在初始化集合并向其添加项的行某处。但是,我看到的问题是,当我试图设置绑定到此集合的组合框的选定索引时:
this.CboItemsSelector.SelectedIndex = 3;
或
this.CboItemsSelector.SelectedItem = this.items[3];
选中的项目在那里,但是UI没有同步。UI的选择器仍然默认为列表中的第一个项目,即使SelectedItem的Name和Value属性实际上对应于底层集合的索引3中的任何内容!
关于如何强制组合框刷新自己有什么想法吗?或者只是简单地解决问题?我知道这是一个相当小的问题,但它是大到足以迫使我重写相当多的代码....:(:(:()
谢谢!
你需要继承ObservableCollection,而不是List。否则不会触发OnPropertyChanged事件,绑定控件也不会知道数据已经被更新了
所选Item的Name和Value属性是否匹配,还是SelectedItem是来自同一集合的实例?. net将不知道通过名称和值来比较项目,除非你告诉它,否则它将使用对象相等来尝试找到列表中的项目。如果你将选择的项目设置为一个实例,它实际上不在列表中(但具有相同的属性),.net将不会在列表中找到它。你有两个选项,覆盖你的对象的相等性和强制属性比较,或者确保你总是将选择的项目设置为列表中的一个项目。也可以试试Andy May的建议,在ItemsSource和SelectedItem上做2路绑定,这样就可以了