2

我是 WPF 新手,所以我不确定我所做的是否有意义.. 无论如何:我正在尝试为使用 ApplicationCommands.Open 的按钮实现命令。在我的 XAML 中,我有:

<Window x:Class="MainWindow"                
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"                
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                
        xmlns:local="clr-namespace:ViewModel"                
        Title="MainWindow" Height="650" Width="1170">                
    <Window.DataContext>                
        <local:ResourceListViewModel/>                
    </Window.DataContext>

我想在 local:ResourceListViewModel 类中有一个命令定义,到目前为止我到了那里:

void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
        {

            MessageBox.Show("The command has been invoked");
        }

        void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }

所以我认为我必须做的就是将这些方法绑定到一个命令,所以我试图这样做:

 <Window.CommandBindings >
        <CommandBinding Command="ApplicationCommands.Open"
                  Executed="OpenCmdExecuted"
                  CanExecute="OpenCmdCanExecute"/>
    </Window.CommandBindings>

但程序没有编译,因为它似乎在 MainWindow 中寻找这些函数。如何让程序知道我的函数定义在不同的类中?

4

1 回答 1

1

这不是命令在 MVVM 中的工作方式。RoutedCommands (如ApplicationCommands.Open, 和DelegateCommands (aka RelayCommands)之间是有区别的。

第一个是与视图相关的和冒泡的可视化树等,必须由视图在代码隐藏中处理。

第二个是 ViewModel 相关的,在 ViewModel 中定义(意味着 Command 实例是 ViewModel 本身的属性成员)

public class ResourceListViewModel
{
    public RelayCommand OpenCommand {get;set;}

    public ResourceListViewModel()
    {
        OpenCommand = new RelayCommand(ExecuteOpenCommand, CanExecuteOpenCommand);
    }

    //etc etc
}
于 2013-01-18T17:06:43.777 回答