【问题标题】:Communication between viewmodels piggybacking off of the iNotifyPropertyChanged system来自 iNotifyPropertyChanged 系统的视图模型之间的通信
【发布时间】:2011-12-28 13:55:40
【问题描述】:

我正在使用 MVVM,我想在视图模型之间进行通信。我有一个用户控件,其中包含另一个用户控件,我希望父用户控件在子项中的属性发生更改时运行一些代码。我已经看到了几种在视图模型之间进行通信的方法,例如使用 MVVM Light Messenger 或 PRISM 事件聚合器,但我希望有某种方法可以简单地通过订阅通过 INotifyPropertyChanged 实现引发的 PropertyChanged 事件来实现这一点.

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

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

【问题讨论】:

    标签: mvvm dependency-properties inotifypropertychanged


    【解决方案1】:

    肯定有多种方法可以处理您的场景。一种肯定是使用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!!!
            }
    
        }
    }
    

    您也可以显式定义一个事件并订阅它。

    【讨论】:

    • 啊太棒了!很简单!不敢相信我没有在 Intellisense 中看到这个事件。如果我是实施 INotifyPropertyChanged 的​​人,会有所帮助,我会了解更多。非常感谢!
    【解决方案2】:

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

    我倾向于尽可能避免使用 MVVM Light “Messenger”。 (使用 IoC 容器时这有点没用,但这是另一回事)

    【讨论】:

    • 为什么对 IoC 没用?是否只使用 GetInstance 来确保所有消息都由有效的侦听器接收?
    • @SliverNinja 我使用像“IMessagingService”这样的注入服务,它的作用与 MVVM Light Messenger 的作用基本相同。
    • @vidalsasoon 是的,我考虑过这一点,但我很犹豫是否要更改所有用户控件的构造函数,直到我知道我不能简单地使用 INotifyPropertyChanged。
    • @vidalsasoon Kerry H 有一个非常简单的解决方案,看看上面
    • @vidalsasoon 我想了更多,另一个原因是因为我不希望我的孩子了解父母。父级正在创建子级(不使用依赖注入),因此似乎一种方式的知识比它们都具有相互引用的耦合度要低。我希望孩子们独立,这样他们就可以在不适应的情况下以其他形式使用,而将父级放在构造函数中会导致每次控件被另一个表单使用时都会产生各种额外的代码。
    猜你喜欢
    • 2012-06-28
    • 2015-02-11
    • 2011-09-06
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多