创建命令的简单方法

本文关键字:方法 简单 命令 创建 | 更新日期: 2023-09-27 17:52:17

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

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

在每篇文章中,他们的做法都不同。我需要你告诉我如何在xaml中绑定它,越详细越好…就像我说的,我是新来的。

谢谢你的帮助。

创建命令的简单方法

下面是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>

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

xaml:

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

在视图模型中:(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;
}