Mvvm 借助iNotifyPropertyChanged系统的viewmodels之间的通信

Mvvm 借助iNotifyPropertyChanged系统的viewmodels之间的通信,mvvm,dependency-properties,inotifypropertychanged,Mvvm,Dependency Properties,Inotifypropertychanged,我正在使用MVVM,我希望在viewmodels之间进行通信。我有一个用户控件,其中包含另一个用户控件,我希望父用户控件在子控件中的属性更改时运行一些代码。我见过几种在viewmodels之间进行通信的方法,例如使用MVVM Light Messenger或PRISM事件聚合器,但我希望有某种方法可以通过订阅通过INotifyPropertyChanged实现引发的PropertyChanged事件来实现这一点 Matt Hamilton在中给出了一个答案,但我很难实现它,因为它需要Depend

我正在使用MVVM,我希望在viewmodels之间进行通信。我有一个用户控件,其中包含另一个用户控件,我希望父用户控件在子控件中的属性更改时运行一些代码。我见过几种在viewmodels之间进行通信的方法,例如使用MVVM Light Messenger或PRISM事件聚合器,但我希望有某种方法可以通过订阅通过
INotifyPropertyChanged
实现引发的
PropertyChanged
事件来实现这一点

Matt Hamilton在中给出了一个答案,但我很难实现它,因为它需要DependencyObject,而且我的ViewModels是POCO而不是DOs


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

确实有多种方法来处理您的场景。其中之一当然是使用
INotifyPropertyChanged
实现来传播事件。问题是容器需要直接引用子ViewModel来订阅
PropertyChanged
事件

类ParentVM { 私有常量字符串SomePropertyName=“SomeProperty”


您还可以显式定义事件并订阅它。

处理场景的方法有多种。其中一种方法当然是使用
INotifyPropertyChanged
实现来发布事件。问题是容器需要直接引用子ViewModel来订阅
正确的视图t更改
事件

类ParentVM { 私有常量字符串SomePropertyName=“SomeProperty”


您还可以显式定义事件并订阅它。

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


我倾向于尽可能避免使用MVVM Light“Messenger”(在使用IoC容器时这是无用的,但那是另一回事)

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


我倾向于尽可能避免使用MVVM Light“Messenger”(在使用IoC容器时它是无用的,但这是另一回事)

为什么它对IoC没有用处?解决方法是只使用GetInstance来确保所有消息都由有效的侦听器接收吗?@Sliverinja我使用注入式服务,如“IMessagingService”这与MVVM Light Messenger的功能基本相同。@Vidalsason是的,我考虑过这一点,但在我知道我不能简单地使用INotifyPropertyChanged之前,我不敢更改所有用户控件的构造函数。@Vidalsason Kerry H有一个非常简单的解决方案,请查看above@vidalsasoon我想了一会儿越来越多的原因是因为我不想让我的孩子了解父母。父母正在创建孩子(没有使用依赖注入)因此,似乎单向知识的耦合性比它们彼此都有引用的耦合性要小。我希望孩子们独立,这样他们就可以在其他形式中使用,而无需修改,并且每次控件被另一种形式使用时,将父控件放在构造函数中都会导致各种额外的代码。为什么它对IoC没有用处呢仅使用GetInstance以确保所有消息都通过有效侦听器接收的变通方法?@SliverNinja我使用注入式服务,如“IMessagingService”这与MVVM Light Messenger的功能基本相同。@Vidalsason是的,我考虑过这一点,但在我知道我不能简单地使用INotifyPropertyChanged之前,我不敢更改所有用户控件的构造函数。@Vidalsason Kerry H有一个非常简单的解决方案,请查看above@vidalsasoon我想了一会儿越来越多的原因是因为我不想让我的孩子了解父母。父母正在创建孩子(没有使用依赖注入)因此,似乎单向知识的耦合性比它们彼此都有引用的耦合性要小。我希望孩子们独立,这样他们就可以在其他形式中使用,而无需修改,并且每次控件被其他形式使用时,将父控件放在构造函数中都会导致各种额外的代码。啊,太好了!太简单了!难以置信我没有在Intellisense中看到此事件。如果我是实现INotifyPropertyChanged的人,我会有所帮助,我会了解更多。非常感谢!啊,太好了!太简单了!难以置信我没有在Intellisense中看到此事件。如果我是实现INotifyPropertyChanged的人,我会有所帮助,我会我明白多了,多谢!
    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!!!
        }

    }
}