WPF:从ViewModel调用View中的方法

8

我正在使用AvalonDock在WPF应用程序中,需要保存用户设置的AvalonDock布局(面板的移动、停靠和分离)。

要执行此操作的函数位于控件本身上(SaveLayout,RestoreLayout)。

正确的方法是什么?

现在,我在mainWindowViewModel中有一个命令,由应用程序在创建窗口视图和视图模型实例时创建。它基本上使继电器命令调用匿名方法,该方法调用所需的视图控件上的函数。这有效,因为应用程序创建窗口和其视图模型。

但是,如果某些较低级别的视图和视图模型也需要执行此操作,我该如何处理?如果使用此方法,我仍然必须在应用程序级别创建命令,并将其通过视图模型发送到需要绑定的位置?在其中,我必须搜索作为视图的用户控件,然后在其中使用avalonDock控件,并将其用于应用程序级别,这容易出错。某种程度上,它似乎很不好...

谢谢!

2个回答

3
你可以引入一个接口IView,这样ViewModel就可以在View上调用方法。这样,ViewModel就不需要知道具体的View类,仍然可以进行单元测试。
如何实现这一点可以通过WPF应用程序框架(WAF)的示例应用程序来展示。

这是我将要使用的,因为它似乎是唯一易于操作且同时可测试的解决方案。 - Marino Šimić

1

消息订阅看起来很酷。在这里,我会让所有的视图模型发布消息,而主应用程序将订阅这些消息。然而,这只解决了我的问题的一部分(最不重要的部分)。我仍然面临一个问题,即如何从主窗口视图下的某些视图控件中调用方法(在其中)。或者您也许有另一种方法可以使其与此工作吗? - Marino Šimić
你能再解释一下吗? - Navid Rahmani
假设我们在一家具有多个站点的公司工作,其中一个站点提供用户控件。其中一些用户控件内部包含AvalonDock控件,以便内部管理停靠。如果我想保存其自己的AvalonDock布局,该怎么办?我可能没有该控件的源代码。但我需要在我的视图中使用它,并在需要时保存其AvalonDock布局。 - Marino Šimić
这是一个不太可能的情况。即使我有源代码,也很难。我需要为AvalonDock和用户控件分配x:name,并且需要在应用程序启动时“查找”它们,以便能够调用该方法进行保存/加载。 - Marino Šimić
你可以搜索AvalonDock控件,点击这里 - Navid Rahmani
Navid,那个解决方案可能有效,但似乎过于复杂了,因为我只需要使用 FrameworkElement.FindName() 即可,但我更喜欢 jbe 的想法。我将在视图上使用 IDockableView,在其中提供这些方法并将其传递给 ViewModel。似乎是更好的解决方案。 - Marino Šimić

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