WPF - 在ViewModel中处理ApplicationCommand

Jam*_*add 6 wpf command mvvm

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

对于UserControl上的按钮将其command属性设置为Find(ApplicationCommands.Find)之类的简单情况,ViewModel将如何处理该命令?我经常看到命令处理程序连接到一个CommandBinding,它被添加到UIElement上的CommandBindings集合中,但是我的ViewModel并不是从UIElement派生的(应该吗?).这些命令本身不会公开要在执行时通知的事件,那么我应该在哪里连接以获取该信息?

编辑:我想使用股票WPF来解决问题,如果可能的话.我知道有很多可用的框架用于此类事情,但希望保持代码简单.

EDIT2:包含一些示例代码.

<UserControl>
  <UserControl.DataContext>
    <local:MyViewModel/>
  </UserControl.DataContext>

  <Button Command="Find"/>
</UserControl>
Run Code Online (Sandbox Code Playgroud)

哪里:

class MyViewModel
{
  // Handle commands from the view here.
}
Run Code Online (Sandbox Code Playgroud)

我可以向UserControl添加一个CommandBinding,它将处理Executed,然后在MyViewModel中调用一个假设的Find方法来完成实际的工作,但这是额外的和不必要的代码.我更喜欢ViewModel本身处理Find命令.一种可能的解决方案是让MyViewModel派生自UIElement,但这似乎是反直觉的.

Vla*_*lad 4

命令的目的是将生成命令的代码与执行命令的代码解耦。因此:如果想要紧密耦合,最好通过事件来实现:

<UserControl ... x:Class="myclass">
    ...
    <Button Click="myclass_find" .../>
    ...
</UserControl>
Run Code Online (Sandbox Code Playgroud)

对于松散耦合,您需要添加一个CommandBinding到您的UserControl

<UserControl ... >
    <UserControl.DataContext>
        <local:MyViewModel/>
    </UserControl.DataContext>

    <UserControl.CommandBindings>
        <Binding Path="myFindCommandBindingInMyViewModel"/>
    </UserControl.CommandBindings>
    ...
    <Button Command="ApplicationComamnd.Find" .../>
    ...
</UserControl>
Run Code Online (Sandbox Code Playgroud)

(不确定语法)

或者您可以在构造函数中CommandBinding添加a ,从 ViewNodel 获取值:UserControlCommandBindings

partial class MyUserControl : UserControl
{
    public MyUSerControl()
    {
        InitializeComponent();
        CommandBinding findCommandBinding = 
                  ((MyViewModel)this.DataContext).myFindCommandBindingInMyViewModel;
        this.CommandBindings.Add(findCommandBinding);
    }
}
Run Code Online (Sandbox Code Playgroud)