c# - 如何使 ViewModel 从 View 中使用的组件调用方法 - WPF Prism
问题描述
在我的视图中,我使用了一个组件(自定义控件),它提供了一些功能。当我的 ViewModel 收到它订阅的事件时,我想调用其中一个。
我想尽可能干净地做到这一点,因为我可能会以这种方式使用更多功能。
我知道我可以创建一个像“InvokeFunctionA”这样的变量,绑定到这个变量并在我的视图中创建 OnChange 方法,它将调用相应的函数。但是仅仅调用一个函数就需要很多代码。还有一个额外的变量,这似乎也很不必要。
有一个更好的方法吗?就像,也许 View 可以将某种处理函数传递给 ViewModel 来完成工作?我做了很多研究,但还没有找到适合我的问题的任何东西。或者也许我错过了一些明显的东西?
[编辑] Haukinger 解决方案现在有效(这样做:https ://blog.machinezoo.com/expose-wpf-control-to-view-model-iii ),但我不认为这是最干净的解决方案(相反为了提供对一些功能的访问,我将整个控件暴露给 ViewModel)。
解决方案
在一个完美的 MVVM 世界中(当您要求一个干净的解决方案时),ViewModel 不会调用位于视图中的任何内容(既不直接也不间接)。我会这样处理问题:
如果“组件”不是用户控件,请尝试将其移动到 ViewModel 并使用视图中的绑定或命令来操作“组件”。
如果“组件”是用户控件,则给“组件”一个依赖属性并通过与您的 ViewModel 属性的绑定来填充它。在“组件”内部,您可以注册依赖属性的值更改回调来开始您的工作。
<local:UserControlComponent MyDependencyProperty="{Binding PropertyInViewModel}" />
作为最后的手段:
您可以将 C# 事件添加到视图模型并在视图内的代码隐藏中处理它。
除了事件,您还可以使用 IObservable 模式(https://docs.microsoft.com/en-us/dotnet/api/system.iobservable-1?view=netframework-4.8,https://github.com/ dotnet/反应式)
为了完整起见,一个不可行的选项:Prism 有一个 EventAggregator 可用于松散通信。我不得不从一个相当大的应用程序中删除 EventAggregator 的使用,因为它不再可维护。
推荐阅读
- codeigniter - 使用 Codeigniter 将日期输入值从视图传递到控制器
- microsoft-teams - 有效域不能使用隧道站点
- c - 如何从 C 中的 char 数组中获取单个单词?
- python-3.x - 生成列表中所有可能的项目组合并将它们存储在不同的列表中,并在以后访问它们。我在下面举了一个例子
- python - Python将字典元组列表转换为数据框
- java - 使用 java replace 方法替换字符串中的字符
- java - Spring JPA 中的 SQL 聚合 GROUP BY 和 COUNT
- powershell - Powershell 在 foreach 运行之前打印文本
- javascript - 按 mongoose-aggregate-paginate-v2 更改顺序排序
- r - 如何在 r 的下半小时内测试同一用户?