视图模型之间的通信捎带iNotifyPropertyChanged系统

时间:2011-12-28 13:55:41

标签: mvvm dependency-properties inotifypropertychanged

我正在使用MVVM,我想在viewmodels之间进行通信。我有一个用户控件,其中包含另一个用户控件,我希望父用户控件在子项中的属性更改时运行一些代码。我已经看到了几种在视图模型之间进行通信的方法,例如使用MVVM Light Messenger或PRISM Event Aggregator,但我希望有一些方法可以通过某种方式订阅通过{{PropertyChanged事件引发的INotifyPropertyChanged事件。 1}}实施。

Matt Hamilton在this post中有一个答案,但是我很难实现它,因为它需要一个DependencyObject,而我的ViewModel是POCO而不是DO

是否有某种方法可以使用INotifyPropertyChanged系统,因为我不希望实现消息传递系统。如果不是消息系统最好的?我还看到一个例子,其中一些人只是使用视图后面的代码来帮助传递属性,但是我不想打破MVVM模式,因为我想在稍后阶段进行一些测试。

2 个答案:

答案 0 :(得分:2)

肯定有多种方法可以处理您的方案。一个肯定是使用INotifyPropertyChanged实现来传播你的事件。问题是容器需要直接引用子ViewModel来订阅PropertyChanged事件。

类ParentVM     {         private const string SomePropertyName =“SomeProperty”;

    public ParentVM()
    {
        ChildVM child = new ChildVM();
        child.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(child_PropertyChanged);
    }

    void child_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == SomePropertyName)
        {
            //Do something!!!
        }

    }
}

您还可以明确定义事件并订阅它。

答案 1 :(得分:2)

我个人会将父视图模型的引用传递给每个子视图模型以便直接访问。

我倾向于尽可能地避开MVVM Light“Messenger”。 (在使用IoC容器时它有点无用,但这是另一个故事)