【问题标题】:View Models Two Way Comminication查看模型 双向通信
【发布时间】:2017-02-10 13:23:57
【问题描述】:

我正在开发一个可重用的 WPF 控件“R”,它有自己的视图模型“VM_R”。 我有一个使用控件 R 的 WPF 主窗口“Main”,它也有自己的视图模型“VM_Main”。

我的问题: 我希望 VM_Main 和 VM_R 以下列方式进行通信:

VM_Main 向 VM_R 发送请求以评估某些内容并将结果发送回 VM_Main。

我考虑了以下选项:

  1. 在 VM_Main 中实例化 VM_R。这将创建一个耦合 担忧。
  2. 我可以使用 MVVM Light Messenger。但是我不想有两个注册呼叫和两个发送呼叫。

谢谢

【问题讨论】:

  • 不,这就是 DepenencyProperty (s) 的用途
  • 你到底为什么要另一个 ViewModel 为你当前的 ViewModel 评估一些东西?
  • 我想从 VM_MAIN 中的 Control R 中读取组合框和复选框值。
  • 视图模型 A 必须引用视图模型 B 并调用方法或调用它的命令,或者两个视图模型可以使用信使相互通信。您还在寻找什么其他选择?要么就是这个,要么将两个视图模型合并为一个。
  • 如果视图模型 A 期望视图模型 B 的结果,您不妨直接引用视图模型 B,因为它们实际上是间接地相互耦合的。如果视图模型 A 在没有从视图模型 B 返回结果的情况下无法正常工作,那么它确实依赖于后者。

标签: c# wpf mvvm viewmodel


【解决方案1】:

我正在开发一个可重用的 WPF 控件“R”,它有自己的视图模型“VM_R”。

这可能是错误的。一般来说,如果您认为您需要一个特定控件的视图模型,那么您实际上是在将代码放在错误的位置。

将这些东西粘贴到控件的代码隐藏中,并公开真实模型或视图模型可以绑定到的依赖属性。

在 VM_Main 中实例化 VM_R。这将产生耦合问题。

这证实了我的怀疑,即您将代码放在错误的位置。

我可以使用 MVVM Light Messenger。

没有。永远不要使用它。 MVVM Light Messenger 只是等待发生的大量内存泄漏。

【讨论】:

    【解决方案2】:

    我会建议使用选项 1,但以更好的方式。您可以使用 DI 将 R_VM 注入 R_Main。这是示例

    public interface IR_VM
    {
        int MyMethod(int param);
    }
    
    public class R_VM : IR_VM
    {
        public int MyMethod(int param)
        {
            // implemention
            return 0;
        }
    }
    
    public class VM_Main
    {
        public VM_Main(IR_VM rvm)
        {
            RVM = rvm;
        }
        public IR_VM RVM { get; set; }
    }
    

    【讨论】:

    • 我认为为 ViewModels 创建接口并不能提高你的代码质量。这有点像“没有直接参考”的解决方法。如果一个视图包含另一个视图,则 ViewModel 可以具有直接引用。
    • 你没有移除任何耦合,你只是让实例化 VM_Main 变得更加复杂。哦,通过添加一层间接来更难调试。
    • 根本没有耦合。在这里,我正在注入 vm,没有直接引用。如果您觉得这很难,那么我建议您先阅读有关 DI 的内容。可能这将有助于理解我的方法。
    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多