我打赌这已被多次回答,但是......
对于UserControl上的按钮将其命令属性设置为Find(ApplicationCommands.Find)之类的简单情况,ViewModel将如何处理该命令?我经常看到命令处理程序连接到一个CommandBinding,它被添加到UIElement上的CommandBindings集合中,但是我的ViewModel并不是从UIElement派生的(应该吗?)。这些命令本身不会公开要在执行时通知的事件,那么我应该在哪里连接以获取该信息?
编辑:如果可能,我想使用股票WPF来解决问题。我知道有很多可用的框架用于此类事情,但我希望保持代码简单。EDIT2:包含一些示例代码。
<UserControl>
<UserControl.DataContext>
<local:MyViewModel/>
</UserControl.DataContext>
<Button Command="Find"/>
</UserControl>
其中:
class MyViewModel
{
// Handle commands from the view here.
}
我可以向UserControl添加一个CommandBinding,它将处理Executed,然后在MyViewModel中调用一个假设的Find方法来完成实际的工作,但这是额外的和不必要的代码。我更喜欢ViewModel本身处理Find命令。一种可能的解决方案是让MyViewModel派生自UIElement,但这似乎是反直觉的。
答案 0 :(得分:4)
命令的目的是将生成顺序的代码与执行它的代码分离。因此:如果你想要紧密耦合,最好通过事件来实现:
<UserControl ... x:Class="myclass">
...
<Button Click="myclass_find" .../>
...
</UserControl>
对于松耦合,您需要在CommandBinding
:
UserControl
<UserControl ... >
<UserControl.DataContext>
<local:MyViewModel/>
</UserControl.DataContext>
<UserControl.CommandBindings>
<Binding Path="myFindCommandBindingInMyViewModel"/>
</UserControl.CommandBindings>
...
<Button Command="ApplicationComamnd.Find" .../>
...
</UserControl>
(不确定语法)
或者您可以在构造函数中向CommandBinding
的{{1}}添加UserControl
,从ViewNodel中获取值:
CommandBindings