如果ICollectionView
背后的集合支持INotifyCollectionChanged
(如ObservableCollection
)和对象本身支持INotifyPropertyChanged
那么,网格应该自动更新
否则,你是你自己和编辑窗口应该提出一些排序的通知(可能是一个事件),您应该接收并更新列表。
好吧,这里的长版本:
WPF数据绑定可以自动更新的用户界面 - 但它需要知道的东西,为了改变触发更新,要做到这一点最简单的方法是支持INotifyPropertyChanged的,让我们创建简单的类:
public class Movie
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
现在,让我们添加INotifyPropertyChanged的支持:
public class Movie : INotifyPropertyChanged
{
public event PropertyChanged;
protected virtual OnPropertyChanged(string property)
{
var ev = PropertyChanged;
if(ev!=null)
{
ev(this, new PropertyChangedEventArgs(property));
}
}
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged("Name");
}
}
}
现在,当您绑定到MOVI e类并更改Name属性,UI将自动更新。
下一步就是处理电影的对象列表,我们这样做,通过使用集合类的工具INotifyCollectionChanged,幸运的是我们有已经写入框架调用的ObservableCollection一个,你的用户的ObservableCollection <牛逼>以同样的方式你可以使用列表<T>。
所以,只需绑定到ObservableCollection,WPF将自动检测对象何时更改或何时添加或删除。
ICollectionView是非常有用的,它增加了对当前项目,排序,过滤,并在真实采集的顶部分组,如果该集合是一个ObservableCollection一切都将只是工作,所以代码:
ObservableCollection<Movie> movies = new ObservableCollection<Movie>();
ICollectionView view = CollectionViewSource.GetDefaultView(movies);
会给你一个支持自动更改通知的集合视图。
来源
2009-11-25 12:38:50
Nir
这似乎不起作用,事件不会被触发,如果我关闭新窗口 – WtFudgE
哦。我不明白为什么上面的代码不起作用 - 我只是将它打成了一个虚拟程序,事件得到了很好的提升。它看起来像你使用VB(我不熟悉),而不是C#,所以这可能是一个问题,我想(尽管我希望事件处理在两种语言中都是相似的)。你是否有应该与打开或关闭窗口进行交互的代码? – MoominTroll
哦,我好像刚刚把代码放在一个错误的窗口中:P 它工作正常,我很抱歉! 这不是vb btw :) – WtFudgE