gpt4 book ai didi

mvvm - 命令和 MVVM 原理 - RelayCommands

转载 作者:行者123 更新时间:2023-12-04 20:11:52 27 4
gpt4 key购买 nike

我是 C#、WPF 和 MVVM 模式的新手。很抱歉这篇很长的帖子,我试图设定我所有的理解点(或不理解点)。

在研究了很多关于 WPF 提供的命令机制和 MVVM 模式的文本之后,我在弄清楚如何使用这些东西上遇到了一些问题。

我了解为 WPF 提供的命令允许为可视树组件中保存的命令逻辑定义多个“调用点”。调用命令时,调用会在可视树中冒泡(从命令目标或焦点元素开始),直到遇到一个包含 CommandBinding 的元素,该元素定义了命令逻辑的位置。

看起来不错的是,您可以在不指定逻辑或调用点的情况下定义公共(public)命令。

我也明白,遵循 MVVM 模式, View 的 ViewModel 应该处理逻辑,而命令的基本 WPF 实现只允许视觉元素处理它,因为调用通过视觉树冒泡。

然后我发现在这种情况下可以使用自定义实现,例如 Josh Smith 的 RelayCommand,因为您将 View 元素(例如按钮)调用的命令绑定(bind)到底层 ViewModel 中的 RelayCommand 对象。

但是,我不再看到它是一个命令(根据 WPF 命令模式的定义),因为我们直接指定了 ViewModel 中引用的实现。使用这种方法,我们失去了能够从任何地方调用命令而不知道逻辑在哪里实现的所有好处。在这种情况下,为什么不直接使用 Click 事件处理程序(例如)?

有人可以解释我哪里错了吗?
(感谢那些把帖子读到最后的人!)

问候。
NR

最佳答案

But then, I dont see how it's a command (by the definition of WPF commanding pattern) anymore since we're directly specifying an implementation that is referenced in the ViewModel.



这仍然是一个命令,并实现 ICommand ,但它不再利用 WPF 中内置的路由策略。这是一个命令,但不再是 RoutedCommand - 所以从某种意义上说,你是对的 - 它没有遵循 WPF 路由命令基础架构的原始概念,但它仍然是一个命令。

With this method, we loose all the benefits of being able to call a command from anywhere without knowing where the logic is implemented. In this case, why not directly use a Click event handler (for example) ?



您仍然保留将逻辑与 View 分离的好处。 View 不需要知道这是如何实现的,ViewModel 可以在不知道 View 将如何触发它的情况下实现命令。该命令仍然可以来自手势、按钮等 - 并且可以更改(完全在 XAML 中),而无需更改逻辑和代码。

切换回事件处理程序会破坏这一点 - 如果您使用事件处理程序,更改 View 的实现需要更新事件处理程序(代码隐藏)。

关于mvvm - 命令和 MVVM 原理 - RelayCommands,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16342059/

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