创建命令的简单方法

时间:2014-03-24 10:46:21

标签: c# wpf xaml

我是C#的新手,我需要为一个按钮创建简单的绑定命令。我过去几个小时一直在阅读很多文章,但这让我更加困惑。

我有一个WPF窗口(让我们说Window1),我有按钮" AddCustomer"。为它创建命令的最简单方法是什么? (简单来说,我的意思很容易理解)

在每篇文章中,他们都采用不同的方式。我需要你告诉我如何在xaml中绑定它,更详细更好...就像我说的,我是新的。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

下面的

是WPF中命令的完整解决方案。

首先创建一个用于执行命令的类。

 public class RelayCommand : ICommand
  {

    readonly Action<object> _execute;
    readonly Predicate<object> _canExecute;
    private Action<object> _action;
    private bool _canSave;


    public RelayCommand(Action<object> execute) : this(execute, null) { }

    public RelayCommand(Action<object> execute, Predicate<object> canExecute)
    {
        if (execute == null) throw new ArgumentNullException("execute");
        _execute = execute;
        _canExecute = canExecute;
    }

    public RelayCommand(Action<object> action, bool CanSave)
    {

        this._action = action;
        this._canSave = CanSave;
    }


    [DebuggerStepThrough]
    public bool CanExecute(object parameter)
    {
        return _canExecute == null || _canExecute(parameter);
    }
    public event EventHandler CanExecuteChanged
    {
        add
        {
            CommandManager.RequerySuggested += value;
        }
        remove
        {
            CommandManager.RequerySuggested -= value;
        }
    }
    public void Execute(object parameter)
    {
        _execute(parameter);
    }

}
下面的

是ViewModel

 public FilterViewModel()
    {
     private RelayCommand _commandSave;
     public ICommand Save
      {
        get { 
           return _commandSave ?? (_commandSave = 
           new RelayCommand(param => SaveMethod(param), CanSave)); 
           }
       }

  private void SaveMethod 
    {
     //code for save
    }

   private Predicate<object> CanSave
    {
        get { return o => true; }
    }

  }

最后在XAML中使用该命令。

 <Button x:Name="btnSave" Content="Save" Command="{Binding Save}"  CommandParameter="PASS-PARAMETER-HERE" ></Button>

答案 1 :(得分:1)

以下是我的看法,以下是“最简单的”,因为您正在利用Prism库,因此您编写的代码量很小。如果你还没有使用它,可以使用nuget管理器将Prism添加到你的项目中......

xaml:

<Button Command="{Binding AddCustomerCommand}" Content="Add Customer"/>

在你的viewmodel中: (1)声明你的命令:

public ICommand AddCustomerCommand{ get; private set; }

(2)定义你的命令:

AddCustomerCommand= new DelegateCommand(AddCustomer);

(3)并创建方法:

private void AddCustomer()
{
    //do your logic here
}

扩展版本: 您可以从xaml传递参数:

<Button Command="{Binding AddCustomerCommand}" CommandParameter={Binding SelectedItem, ElementName=MySelectorThingy} Content="Add Customer"/>

请记住更改委托和方法的签名:

AddCustomerCommand= new DelegateCommand<WhateverMyTypeIs>(AddCustomer);

private void AddCustomer(WhateverMyTypeIs selectedThing)
{
    //do your logic here
}

您还可以在DelegateCommand中定义按钮何时可用(CanExecute),如下所示:

public DelegateCommand AddCustomerCommand{ get; private set; }

AddCustomerCommand = new DelegateCommand(AddCustomer, AddCustomer_CanExecute);

然后定义决定是否可以执行的方法:

private bool AddCustomer_CanExecute()
{
    if (DateTime.Now.DayOfWeek.Equals(DayOfWeek.Monday))
      return true;
    else
      return false;
}