命令和MVVM原则-RelayCommand

命令和MVVM原则-RelayCommand,mvvm,command,relaycommand,Mvvm,Command,Relaycommand,我不熟悉C#、WPF和MVVM模式。很抱歉,这篇很长的帖子,我正在尝试设置我所有的理解点(或不理解点) 在学习了大量关于WPF提供的命令机制和MVVM模式的文本之后,我有一些问题需要弄清楚如何使用这些东西 我知道为WPF提供的命令允许为保存在可视化树组件中的命令逻辑定义多个“调用点”。调用命令时,调用会在可视树中冒泡(从命令目标或聚焦元素开始),直到它碰到一个包含CommandBinding的元素,CommandBinding定义了命令逻辑的位置 这样做的好处在于,您可以定义公共命令,而无需首先

我不熟悉C#、WPF和MVVM模式。很抱歉,这篇很长的帖子,我正在尝试设置我所有的理解点(或不理解点)

在学习了大量关于WPF提供的命令机制和MVVM模式的文本之后,我有一些问题需要弄清楚如何使用这些东西

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

这样做的好处在于,您可以定义公共命令,而无需首先指定逻辑或调用点

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

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

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

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

问候。 天然橡胶

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

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

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

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


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

在进一步研究如何在MVVM项目中使用原始WPF命令行为后,我发现了以下链接:

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


再见。

回答得好。我也在学习WPF,我发现这相当困难。你能评论一下如何使用从另一个方法调用的命令中包含的逻辑吗?我想在本例中,您将编写一个具有适当逻辑的方法,并从命令中调用它?谢谢您的时间。@Killercam通常,您要调用的每个“方法”都封装在一个
ICommand
-您可以有一个
ICommand
,它只包含多个方法(就像有一个方法调用>1个方法一样)。非常感谢您的时间。好的,谢谢您的回答,我忽略了命令可以从视图中的各种输入(手势,…)触发的事实。