最近我一直在学习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的内容 –