如果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