命令和MVVM原则 - RelayCommands

6

我是C#,WPF和MVVM模式的新手。很抱歉这篇文章有点长,我正在尝试阐述我的所有理解点(或者不理解点)。

在研究了许多有关WPF提供的命令机制以及MVVM模式的文本后,我在如何使用这些东西方面遇到了一些问题。

我知道WPF提供的命令允许定义多个"调用点",用于调用保存在可视树组件中的命令逻辑。当调用命令时,呼叫从可视树中冒泡(从命令目标或聚焦元素开始),直到撞到一个包含定义命令逻辑的CommandBinding的元素为止。

这看起来很好,因为您可以首先定义公共命令,而无需指定逻辑或调用点。

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

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

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

有人能解释一下我错在哪里吗? (感谢那些读完了这篇文章的人!)

问候。 NR

2个回答

5
但是,我不明白它如何成为命令(根据WPF命令模式的定义),因为我们直接指定了在视图模型中引用的实现。
这仍然是一个命令,并实现了ICommand,但它不再利用WPF内置的路由策略。从某种意义上说,它仍然是一个命令,但不再是RoutedCommand - 所以在某种程度上,你是对的 - 它不再遵循WPF路由命令基础架构的原始概念,但它仍然是一个命令。
使用此方法,我们失去了能够在不知道逻辑实现位置的情况下从任何地方调用命令的所有好处。在这种情况下,为什么不直接使用Click事件处理程序(例如)?
你仍然保持将逻辑与视图分离的好处。视图不需要知道如何实现它,视图模型可以实现命令而不知道视图将如何触发它。命令仍然可以来自手势、按钮等,并且可以更改(完全在XAML内部),而不需要改变逻辑和代码。
切换回事件处理程序会破坏这个过程 - 如果使用事件处理程序,更改视图的实现需要更新事件处理程序(代码后台)。

很好的回答。我也正在学习WPF,发现它相当困难。你能评论一下如何使用从另一个方法调用的命令中包含的逻辑吗?我想在这种情况下,你会编写一个具有适当逻辑的方法,并从命令中调用它,是吗?感谢您的时间。 - MoonKnight
2
@Killercam 通常来说,你想要调用的每个“方法”都会被封装在一个单独的 ICommand 中 - 你可以有一个只组合多个方法的 ICommand,就像有一个调用>1个方法的方法一样。 - Reed Copsey
好的,谢谢你的回答。我没有注意到该命令可以从视图内的各种输入(手势等)触发。 - nrdev

0

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

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

再见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接