【问题标题】:MVVM Mediator multiple instancesMVVM 中介多实例
【发布时间】:2009-11-03 13:42:34
【问题描述】:

谁能解释中介者模式如何与多个实例一起工作。

我在视图中的代码:

public MyView() {
    Mediator.Register("CloseWindow",()=>Close());
}

在 ViewModel 中:

public SomeMethod() {
    Mediator.Notify("CloseWindow");
}

只要 View - ViewModel 对只有一个实例,就可以找到。

如何解决多个实例?

【问题讨论】:

    标签: wpf mvvm mediator


    【解决方案1】:

    我使用另一种解决方案。 MyView 实现了一个包含 Close 方法的接口 IMyView。 MyViewModel 对象关联 View,因此它可以通过接口调用 Close 方法。

    如果您对具体示例感兴趣,可以查看:

    WPF Application Framework (WAF)

    【讨论】:

    • 我选择了中介模式,因为它看起来比接口简单,而且我可以将它用于垂直(MVV)和水平(MVMV)。我现在看到它是错误的,将使用接口代替。在我看来,调解者模式从根本上被打破了(至少对于观点而言)。中介使用 GC 进行生命周期控制,而视图则没有。因此,答案是不要使用调解器来获取视图。
    【解决方案2】:

    我不知道您的中介模式的特定实现是如何工作的,但在我的中,您可以发送更多信息而不仅仅是字符串。

    例如:

    public MyView() {
        Mediator.Register<CloseWindowMessage>(message =>
        {
            if (message.ViewModel == DataContext) Close();
        });
    }    
    

    在 ViewModel 中:

    public SomeMethod() {
        Mediator.Notify(new CloseWindowMessage(this));
    }
    

    在此示例中,ViewModel 将自身作为参数传递给视图。然后视图可以检查消息是否从其视图模型发送。

    【讨论】:

    • 我想到了这一点,但我认为这在很大程度上是一种选择加入的策略。我倾向于在 Close 事件中取消注册消息的解决方案。
    • 或者您可以为每个对话框创建一个单独的消息类,然后避免“选择加入”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多