我现在正在玩ICollectionView,我遇到了一个问题,我认为我理解“为什么”,但不是“如何修复它”。 :)
我有一个可以数据绑定到ICollectionView的ComboBox,它最初使用以下代码设置:
NameView = CollectionViewSource.GetDefaultView( names); // names is an IEnumerable<string> that comes from a LINQ query
NameView.CurrentChanged += new EventHandler(NameView_CurrentChanged);
在我执行一段生成新IEnumerable<string>
的代码并使用与上面相同的代码再次设置NameView之前,一切都很有效。执行此操作后,CurrentItem
将无法正常运行。
我在使用ObservableCollection<string>
数据绑定到ComboBox之前遇到过这个问题,我使用Clear()
和Add()
来解决“解除绑定”问题,而不是设置{{1属性为新ObservableCollection<string>
。
我的问题包括:
1.如果我希望能够将属性设置为新集合,我可以以某种方式重新建立与新集合的数据绑定吗?如果是这样,怎么样?如果没有,你能解释为什么这根本不可能的WPF主义吗?
2.处理ObservableCollection<string>
或ObservableCollection<string>
更改的最佳方法是什么?我的方法只是清除和添加唯一的方法吗?
答案 0 :(得分:1)
当您将WPF控件绑定到ICollectionViews时(在使用InitializeComponent调用解析XAML时发生 - 您应该在XAML中真正定义绑定!),Controls会订阅您的集合发布的必需事件(例如CollectionChanged) 。
您的集合属性只是对内存地址的引用。当您将其弯曲到新集合(即新地址)时,DataBinding将不会注意到。您不能指望原始Collection会发布类似“IAmOuttaHere”的内容,显然控件不会收听一个新的集合,上面写着“我是新人”。但是如果我正确看到这一点,你的代码片段什么都不做,只是将一个事件处理程序添加到CurrentChanged(意味着当你选择Combobox中的其他项时你的观察)
绑定是关于通知的,所以 - 只要你不告诉你的控件已经交换了集合,他们就会坚持初始集合。请尝试像这样实现INotifyPropertyChanged:
public class ViewModel : INotifyPropertyChanged
{
private ICollectionView myCollection;
public ICollectionView MyCollection
{
get
{
return this.myCollection;
}
set
{
this.myCollection = value;
this.OnPropertyChanged("MyCollection");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public void ExchangeCollection()
{
this.MyCollection = new CollectionView(....)
}
}
任何绑定都应该对MyCollection进行。虽然,就个人而言,我自己并没有定义ICollectionViews,因为它们并不像使用漂亮的IList那样好用,并且只要定义了绑定,它们就会自动包装在任何集合中。
希望这有帮助
塞比