命令和MVVM原理

我是C#,WPF和MVVM模式的新手。 对不起,这篇相当长的文章,我试图设定我所有的理解点(或不理解)。

在研究了WPF提供的命令机制和MVVM模式的大量文本之后,我有几个问题想起如何使用这些东西。

我知道为WPF提供的命令允许为可视树的组件中的命令逻辑定义多个“调用点”。 当一个命令被调用时,调用通过可视化树起泡(从命令目标或焦点元素开始),直到碰到一个持有CommandBinding的元素,该CommandBinding定义了命令逻辑的位置。

看起来不错的是,你可以定义公共命令,而不必先指定逻辑或调用点。

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

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

但是,我不知道它是如何作为命令的(通过WPF命令模式的定义),因为我们直接指定了在ViewModel中引用的实现。 通过这种方法,我们可以放弃从任何地方调用命令的所有好处,而无需知道逻辑的实现位置。 在这种情况下,为什么不直接使用Click事件处理程序(例如)?

有人能解释我哪里错了吗? (感谢那些阅读帖子的人!)

问候。 NR


但是,我不知道它是如何作为命令的(通过WPF命令模式的定义),因为我们直接指定了在ViewModel中引用的实现。

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

通过这种方法,我们可以放弃从任何地方调用命令的所有好处,而无需知道逻辑的实现位置。 在这种情况下,为什么不直接使用Click事件处理程序(例如)?

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

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


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

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

再见。

链接地址: http://www.djcxy.com/p/56133.html

上一篇: Commands and MVVM principles

下一篇: Button doesn't become disabled when command CanExecute is false