我是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>
但程序没有编译,因为它似乎在MainWindow中寻找这些功能。我怎样才能让程序知道我的函数的定义属于不同的类?
答案 0 :(得分:1)
这不是Commands在MVVM中的工作方式。 RoutedCommand
s(例如ApplicationCommands.Open
和DelegateCommand
s(a.k.a RelayCommand
s)之间存在差异。
第一个是视图相关的,并且可视化树等,并且必须由代码隐藏中的View处理。
第二个是与ViewModel相关的并且在ViewModel中定义(意味着Command实例是ViewModel本身的属性成员)
public class ResourceListViewModel
{
public RelayCommand OpenCommand {get;set;}
public ResourceListViewModel()
{
OpenCommand = new RelayCommand(ExecuteOpenCommand, CanExecuteOpenCommand);
}
//etc etc
}