gpt4 book ai didi

c# - 如何使 ViewModel 从 View 中使用的组件调用方法 - WPF Prism

转载 作者:行者123 更新时间:2023-11-30 21:27:42 39 4
gpt4 key购买 nike

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

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


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

有更好的方法吗?比如,也许 View 可以将某种处理函数传递给 ViewModel 来完成这项工作?我做了很多研究,但还没有找到适合我的问题的东西。还是我遗漏了一些明显的东西?


[编辑]Haukinger 解决方案目前有效(以这种方式完成:https://blog.machinezoo.com/expose-wpf-control-to-view-model-iii),但我认为这不是最干净的解决方案(我没有提供对一些功能的访问,而是将整个控制权暴露给 ViewModel)。

最佳答案

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

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

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

作为最后的手段:

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

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

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

关于c# - 如何使 ViewModel 从 View 中使用的组件调用方法 - WPF Prism,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57324240/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com