我有一个绑定到一个集合的组合框,该集合本质上是一个名称/值对列表。集合可以有多个具有不同名称的项目,但值可能相同。
public class NameValuePair
{
public string Name { get; set; }
public string Value { get; set; }
}
public class NameValuePairCollection : List<NameValuePair>
{
public NameValuePairCollection(): base() { }
}
因此,在我的用户控件中,我有一个名为items的私有字段,它是NameValuePair集合的一个实例:
private NameValuePairCollection items = new NameValuePairCollection()
在某些地方,集合被初始化并且项目被添加到它。但是,我看到的问题是当我尝试设置绑定到此集合的组合框的选定索引时:
this.CboItemsSelector.SelectedIndex = 3;
或
this.CboItemsSelector.SelectedItem = this.items[3];
所选项目在那里,但UI未同步。 UI的选择器仍然默认为列表中的第一个项目,甚至认为SelectedItem的Name和Value属性与底层集合的索引3中的任何内容完全相同!
关于如何强制ComboBox刷新自己的任何想法?或者只是解决问题?我知道这是一个非常小的问题,但它足以迫使我重写相当多的代码.... :( :( :(
谢谢!
答案 0 :(得分:1)
您需要继承ObservableCollection,而不是List。否则,不会触发OnPropertyChanged事件,绑定控件也不会知道数据已更新。
答案 1 :(得分:1)
所选项目的名称和值属性是否匹配,或者是同一集合中的SelectedItem实例?除非你告诉它,否则.Net不会知道按名称和值比较项目,否则它将使用对象相等来尝试找到列表中的项目。如果要将所选项目设置为实际不在列表中的实例(但具有相同的属性).net将不会在列表中找到它。您有2个选项,覆盖对象的相等性并强制比较属性,或者确保始终将所选项目设置为列表中的项目。同时尝试Andy May建议并对ItemsSource和SelectedItem进行2路绑定,然后应该工作