从UserControl ViewModel引发事件
我有一个使用MVVM的WPF应用程序
MainWindowViewModel具有对其他ViewModels的引用,如下所示: -
this.SearchJobVM = new SearchJobViewModel();
this.JobDetailsVM = new JobDetailsViewModel();
this.JobEditVM = new JobEditViewModel();
我在MainWindow上有一个名为StatusMessage的标签,它绑定到MainWindowViewModel上的字符串属性
我想要更新以更改任何其他视图模型上的此消息,并在UI上进行更新
我是否需要将其他ViewModels中的事件引发到MainWindowViewModel?
我如何去实现这一目标?
我能想到的最干净的方式(有时我自己也这样做)是将对MainWindowViewModel的引用传递给这些子视图模型,即:
this.SearchJobVM = new SearchJobViewModel(this);
this.JobDetailsVM = new JobDetailsViewModel(this);
this.JobEditVM = new JobEditViewModel(this);
然后从这些子视图模型中的一个,只要您将引用存储在名为MainViewModel的属性中,就可以执行如下操作:
MainViewModel.StatusMessage = "New status";
如果你的虚拟机支持INotifyPropertyChanged,那么一切都会自动更新。
我认为这取决于您希望视图模型彼此独立多少;
user3690202的解决方案尽管可行,但它在MainViewModel上创建了子视图模型(SearchJobViewModel等)的依赖关系。
而且因为你的视图模型可能已经实现了INotifyPropertyChanged,所以你可以在childviewmodels一个属性上公开消息,并让MainViewModel监听childviewmodels的变化。
因此,你会得到如下的东西:
class SearchJobViewModel : INotifyPropertyChanged
{
string theMessageFromSearchJob;
public string TheMessageFromSearchJob
{
get { return theMessageFromSearchJob; }
set {
theMessageFromSearchJob = value;
/* raise propertychanged here */ }
}
}
然后在MainViewModel中:
this.SearchJobVM = new SearchJobViewModel();
this.SearchJobVM += SearchJobVM_PropertyChanged;
void SearchJobVM_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "TheMessageFromSearchJob")
{
this.StatusMessage = this.SearchJobVM.TheMessageFromSearchJob;
}
}
链接地址: http://www.djcxy.com/p/39543.html