首页 > 解决方案 > 如何使 ViewModel 从 View 中使用的组件调用方法 - WPF Prism

问题描述

在我的视图中,我使用了一个组件(自定义控件),它提供了一些功能。当我的 ViewModel 收到它订阅的事件时,我想调用其中一个。

我想尽可能干净地做到这一点,因为我可能会以这种方式使用更多功能。


我知道我可以创建一个像“InvokeFunctionA”这样的变量,绑定到这个变量并在我的视图中创建 OnChange 方法,它将调用相应的函数。但是仅仅调用一个函数就需要很多代码。还有一个额外的变量,这似乎也很不必要。

有一个更好的方法吗?就像,也许 View 可以将某种处理函数传递给 ViewModel 来完成工作?我做了很多研究,但还没有找到适合我的问题的任何东西。或者也许我错过了一些明显的东西?


[编辑] Haukinger 解决方案现在有效(这样做:https ://blog.machinezoo.com/expose-wpf-control-to-view-model-iii ),但我不认为这是最干净的解决方案(相反为了提供对一些功能的访问,我将整个控件暴露给 ViewModel)。

标签: c#wpfprism

解决方案


在一个完美的 MVVM 世界中(当您要求一个干净的解决方案时),ViewModel 不会调用位于视图中的任何内容(既不直接也不间接)。我会这样处理问题:

  1. 如果“组件”不是用户控件,请尝试将其移动到 ViewModel 并使用视图中的绑定或命令来操作“组件”。

  2. 如果“组件”是用户控件,则给“组件”一个依赖属性并通过与您的 ViewModel 属性的绑定来填充它。在“组件”内部,您可以注册依赖属性的值更改回调来开始您的工作。<local:UserControlComponent MyDependencyProperty="{Binding PropertyInViewModel}" />

作为最后的手段:

  1. 您可以将 C# 事件添加到视图模型并在视图内的代码隐藏中处理它。

  2. 除了事件,您还可以使用 IObservable 模式(https://docs.microsoft.com/en-us/dotnet/api/system.iobservable-1?view=netframework-4.8https://github.com/ dotnet/反应式

为了完整起见,一个不可行的选项:Prism 有一个 EventAggregator 可用于松散通信。我不得不从一个相当大的应用程序中删除 EventAggregator 的使用,因为它不再可维护。


推荐阅读