搭载 iNotifyPropertyChanged 系统的视图模型之间的通信

发布于 2024-12-23 10:14:31 字数 666 浏览 3 评论 0原文

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

马特·汉密尔顿 (Matt Hamilton) 在 这篇文章但我在实现它时遇到了麻烦,因为它需要一个 DependencyObject,并且我的 ViewModel 是 POCO 而不是 DO

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

I am using MVVM and I would like to communicate between viewmodels. I have a user control that contains another user control inside it, and I would like the parent usercontrol to run some code when a property in the child is changed. I have seen several ways to communicate between viewmodels, such as using MVVM Light Messenger, or PRISM Event Aggregator, but I was hoping there was some way to accomplish this simply by somehow subscribing to the PropertyChanged event raised through the INotifyPropertyChanged implementation.

There is an answer by Matt Hamilton in this post but I have trouble implementing it because it needs a DependencyObject, and my ViewModels are POCOs rather than DOs

Is there some way of using the INotifyPropertyChanged system, as I would prefer to not have to implement a messaging system. If not is a messaging system the best? I also saw an example where some guy just used the code behind of the view to help pass the property, however I don't want to break the MVVM pattern as I wanna do some testing at a later stage.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

还不是爱你 2024-12-30 10:14:31

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

类ParentVM
{
私有 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!!!
        }

    }
}

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

There definately multiple ways to handle your scenario. One is certainly to use the INotifyPropertyChanged implementation to propogate your event. The issue is that container would need a direct reference to the child ViewModel to subscribe to the PropertyChanged event.

class 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!!!
        }

    }
}

You could also explicitly define an event and subscribe to it.

愛放△進行李 2024-12-30 10:14:31

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

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

Personally I would pass a reference of the parent viewmodel to each child viewmodel to have direct access.

I tend to avoid the MVVM Light "Messenger" as much as possible. (it's kind of useless when using IoC containers but that's another story)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文