命令定义在不同的类中

本文关键字:定义 命令 | 更新日期: 2023-09-27 17:54:29

我是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>

我想有一个命令定义在本地: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>

,但程序没有编译,因为它似乎在主窗口中寻找这些函数。我怎样才能让程序知道我的函数的定义是在一个不同的类?

命令定义在不同的类中

这不是命令在MVVM中的工作方式。RoutedCommand s(如ApplicationCommands.Open)与DelegateCommand s(又称RelayCommand s)之间存在差异。

第一个是与视图相关的,并在可视树中冒泡,等等,并且必须由视图在代码后处理。

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

public class ResourceListViewModel
{
    public RelayCommand OpenCommand {get;set;}
    public ResourceListViewModel()
    {
        OpenCommand = new RelayCommand(ExecuteOpenCommand, CanExecuteOpenCommand);
    }
    //etc etc
}