WPF - 在ViewModel中处理ApplicationCommand

时间:2010-02-24 18:24:52

标签: wpf mvvm command

我打赌这已被多次回答,但是......

对于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,但这似乎是反直觉的。

1 个答案:

答案 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