最近我一直在學習C#和WPF的工作。我正在嘗試在我正在開發的項目上使用MVVM,只是爲了保持代碼的有序性並瞭解它的工作原理。多次調用PropertyChanged的ViewModel屬性
在MVVM中,View上的控件綁定到實現INotifyPropertyChanged的ViewModel上的屬性。很多時候,當某個屬性更新時,我會希望一堆其他屬性作爲結果進行更新。
例如,我有一個ListBox上面有一個TextBox。您可以輸入文本框,並過濾列表框中的內容。但是在某些情況下,我還需要能夠從代碼中清除文本框。代碼最終看起來是這樣的:
private Collection<string> _listOfStuff;
public Collection<string> FilteredList
{
get
{
if (String.IsNullOrWhiteSpace(SearchText))
{
return _listOfStuff;
}
else
{
return new Collection<string>(_listOfStuff.Where(x => x.Contains(SearchText)));
}
}
set
{
if (value != _listOfStuff)
{
_listOfStuff = value;
OnPropertyChanged("FilteredList");
}
}
}
private string _searchText;
public string SearchText
{
get { return _searchText; }
set
{
if (value != _searchText)
{
_searchText = value;
OnPropertyChanged("SearchText"); // Tells the view to change the value of the TextBox
OnPropertyChanged("FilteredList"); // Tells the view to update the filtered list
}
}
}
隨着這個項目變得越來越大,這開始感覺馬虎。我有一個接線員,打了6個電話給OnPropertyChanged
,並且很難跟蹤東西。有一個更好的方法嗎?
通過馬虎你是指很多OnPropertyChanged語句?那這正是你想要的不是? – Muds
你不必調用'OnPropertyChanged(「FilteredList」);'因爲它沒有改變/分配。當它被改變時(即在一個異步命令中),當你執行'FilteredList = await SomeAsyncMethod()'時,它會被通知。你到底想要歸檔什麼? – Tseng
@Tseng我必須調用OnPropertyChanged(「FilteredList」);'因爲它的值取決於SearchText的內容 –