6

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

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

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

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

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

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

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

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

问候。NR

4

2 回答 2

5

但是,我不再看到它是一个命令(根据 WPF 命令模式的定义),因为我们直接指定了 ViewModel 中引用的实现。

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

使用这种方法,我们失去了能够从任何地方调用命令而不知道逻辑在哪里实现的所有好处。在这种情况下,为什么不直接使用 Click 事件处理程序(例如)?

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

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

于 2013-05-02T15:41:48.093 回答
0

在进一步研究了如何在 MVVM 项目中使用原始 WPF 命令行为之后,我发现了这个链接: http: //matthamilton.net/commandbindings-with-mvvm

据我了解,它提供了一种“附加”到视图的方法,CommandBindings 由视图模型处理。这样,视图模型将能够实现命令绑定,当命令调用遍历可视化树时会发现该命令绑定。

再见。

于 2013-05-03T08:04:26.557 回答