命令定义在另一个类中

时间:2013-01-18 16:53:01

标签: c# wpf binding command

我是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中寻找这些功能。我怎样才能让程序知道我的函数的定义属于不同的类?

1 个答案:

答案 0 :(得分:1)

这不是Commands在MVVM中的工作方式。 RoutedCommand s(例如ApplicationCommands.OpenDelegateCommand 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
}