Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-从UserControl ViewModel引发事件_C#_Wpf - Fatal编程技术网

C# WPF-从UserControl ViewModel引发事件

C# WPF-从UserControl ViewModel引发事件,c#,wpf,C#,Wpf,我有一个使用MVVM的WPF应用程序 MainWindowViewModel引用了其他ViewModel,例如:- this.SearchJobVM = new SearchJobViewModel(); this.JobDetailsVM = new JobDetailsViewModel(); this.JobEditVM = new JobEditViewModel(); 我在MainWindow上有一个名为Stat

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

MainWindowViewModel引用了其他ViewModel,例如:-

            this.SearchJobVM = new SearchJobViewModel();
            this.JobDetailsVM = new JobDetailsViewModel();
            this.JobEditVM = new JobEditViewModel();
我在MainWindow上有一个名为StatusMessage的标签,它绑定到MainWindowViewModel上的字符串属性

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

是否需要将事件从其他ViewModel引发到MainWindowViewModel


如何实现这一点?

我能想到的最简洁的方法是将对MainWindowViewModel的引用传递到这些子视图模型中,即:

        this.SearchJobVM = new SearchJobViewModel(this);
        this.JobDetailsVM = new JobDetailsViewModel(this);
        this.JobEditVM = new JobEditViewModel(this);
然后,如果您已将引用存储在名为MainViewModel的属性中,则可以从这些子视图模型之一执行以下操作:

MainViewModel.StatusMessage = "New status";

如果您的虚拟机支持INotifyPropertyChanged,则所有内容都将自动更新。

我认为这取决于您希望viewmodels相互独立的程度

user3690202的解决方案虽然可行,但确实在MainViewModel上创建了子viewmodels(SearchJobViewModel等)的依赖关系

而且,由于您的viewmodels可能已准备好实现INotifyPropertyChanged,因此您可以公开childviewmodels a属性上的消息,并使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;
    }
}

你能提供更多的细节吗?是否尝试从其他viewmodels更新此状态消息?或者,当在MistVIEW模型上更改此状态消息时,您想更新其他视图模型吗?这也是一个有效的点,在编写答案之前我已经考虑过了。一如往常,这是分离和复杂性之间的微妙平衡。我的答案很简单。如果您在虚拟机之间有一些概念上的分离,那么可以这样做,或者更好地使用一个简单的事件发布/订阅模式来打破依赖关系。