WPF - 从UserControl ViewModel

时间:2015-08-24 05:20:40

标签: c# wpf

我有一个使用MVVM的WPF应用程序

MainWindowViewModel引用了其他ViewModel,如下所示: -

            this.SearchJobVM = new SearchJobViewModel();
            this.JobDetailsVM = new JobDetailsViewModel();
            this.JobEditVM = new JobEditViewModel();

我在MainWindow上有一个名为StatusMessage的Label,它绑定到MainWindowViewModel上的字符串属性

我想更新以在任何其他视图模型上更改此消息并在UI上更新

我是否需要将事件从其他ViewModel提升到MainWindowViewModel?

我如何实现这一目标?

2 个答案:

答案 0 :(得分:2)

我能想到你做到这一点的最干净的方式(有时我自己这样做)是将对MainWindowViewModel的引用传递给这些子视图模型,即:

        this.SearchJobVM = new SearchJobViewModel(this);
        this.JobDetailsVM = new JobDetailsViewModel(this);
        this.JobEditVM = new JobEditViewModel(this);

然后从其中一个子视图模型中,只要您将引用存储在名为MainViewModel的属性中,就可以执行以下操作:

MainViewModel.StatusMessage = "New status";

如果你的VM支持INotifyPropertyChanged,那么一切都会自动更新。

答案 1 :(得分:1)

我认为这取决于你希望视图模型彼此独立的程度;

user3690202的解决方案尽管可行但确实在MainViewModel上创建了子视图模型(SearchJobViewModel等)的依赖关系。

因为你的viewmodel可能已经全部实现了INotifyPropertyChanged,你可以在childviewmodels上公开一个属性的消息,并让MainViewModel监听childviewmodel上的更改。

因此,您会得到类似以下内容的内容:

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;
    }
}