命令和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