命令定义在不同的类中
本文关键字:定义 命令 | 更新日期: 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
}