视图模型双向通信

3
我正在开发一个可重用的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。但是,我不想有两个Register Calls and two Sends calls。
谢谢

不,这就是DependencyProperty的作用。 - user585968
你到底为什么想要另一个ViewModel来评估当前ViewModel的某些内容? - Nawed Nabi Zada
我想从VM_MAIN中读取Control R中的组合框和复选框的值。 - John
1
如果视图模型A期望从视图模型B获得结果,那么最好直接引用视图模型B,因为它们实际上无论如何都是间接耦合的。如果视图模型A没有从视图模型B获取返回结果就无法正常工作,那么它确实依赖于后者。 - mm8
我觉得这源于设计问题。@John,你是否反对改变你的关系?相比之下,有两个选择会导致巨大的依赖性。 - Ginger Ninja
显示剩余6条评论
2个回答

0
我正在开发一个可重用的WPF控件“R”,它有自己的视图模型“VM_R”。
那可能是错误的。一般来说,如果您认为特定控件需要视图模型,那么您真正做的是将代码放错了位置。
将该内容放入控件的代码后置中,并公开依赖属性,以便实际模型或视图模型可以绑定到它们。
在VM_Main中实例化VM_R。这将创建耦合关注点。
这证实了我的怀疑,即您将代码放错了位置。
不要使用MVVM Light Messenger。MVVM Light Messenger只是等待发生大规模内存泄漏的问题。

-1

我建议选择选项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; }
}

1
我认为为ViewModel创建接口并不能提高代码质量。这有点像一个绕过“直接引用”的解决方法。如果一个视图包含另一个视图,ViewModel可以直接引用它。 - dvjanm
你并没有消除任何耦合,只是让实例化VM_Main变得更加复杂了。哦,还增加了一层间接性,使调试更加困难。 - Jonathan Allen
这里完全没有耦合。我在这里注入vm,而不是直接引用。如果你觉得这很难理解,那我建议先了解一下DI。可能这会有助于理解我的方法。 - Shashi Bhushan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接