【发布时间】:2017-03-24 09:29:23
【问题描述】:
我正在学习 wpf、delegate、event 并且我对什么做什么有一些线索,但是在实现 ICommand 时我有点迷茫
我有一个类可以像这样实现ICommand 接口
class RelayCommand : ICommand
{
private Action<object> _execute;
private Func<object, bool> _canExecute;
public RelayCommand(Action<object> execute) : this (execute, null)
{
}
public RelayCommand(Action<object> execute, Func<object,bool> canExecute)
{
this._execute = execute;
this._canExecute = canExecute;
}
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
//throw new NotImplementedException();
return true;
}
public void Execute(object parameter)
{
//throw new NotImplementedException();
this._execute(parameter);
}
public void OnCanExecute()
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
然后是我使用 i 的 ViewModel。
class PersonViewModel
{
public ICommand ICommandPresenter { get; set; }
public PersonModel PM;
private string _btnString = "";
#region Propertys
public string ButtonString
{
get {return _btnString; }
set
{
if (_btnString.Equals(value))
{
return;
}
_btnString = value;
}
}
public string Name { get { return PM.Name; } set
{
PM.Name = value;
}
}
#endregion Propertys
public PersonViewModel()
{
PM = new PersonModel();
ICommandPresenter = new RelayCommand(ChangeName);
}
public void ChangeName(object a)
{
string s = a as string;
MessageBox.Show("Hello from PersonViewModel Commander: " + s);
}
}
这就是让我感到困惑的地方。在RelayCommand 类中,我有一个事件CanExecuteChanged,但该事件从未执行/触发。从我对事件的阅读中了解到,您“不需要”订阅某个事件,但如果您要拥有一个事件,您至少应该在代码中的某个位置执行它。但是我的代码中没有它,但由于某种原因,我的按钮仍然执行我命令它执行的操作。我仍然明白我已经点击了该按钮,但我的代码中没有任何订阅该按钮的内容。
- 为什么我的按钮即使没有连接事件也能执行我的代码?
- 由于我没有任何订阅者连接到
CanExecuteChanged事件,它变得无用了吗? - 命令是否像事件一样起作用?如果有,请描述从点击按钮到执行命令的整个过程。
【问题讨论】: