References:
https://www.c-sharpcorner.com/uploadfile/e06010/wpf-icommand-in-mvvm/
Commands提供一种机制,为了view去更新model
该接口包括 2个method 和1个 event.
bool CanExecute(object parameter);
void Execute(object parameter);
event EventHandler CanExecuteChanged;
Execute方法只能在 CanExecute方法返回true才能执行,如果 CanExecute方法返回为false,那么binding control就会
disabled automatically.
为了知道 CanExecute的value,那就必须监听 CanExecuteChanged 这个事件,这可能会根据参数的变化而变化着。
public ICommand UpdateCommand
{
get
{
if (mUpdater == null)
mUpdater = new Updater();
return mUpdater;
}
set
{
mUpdater = value;
}
} // UpdateCommand 是ICommand的实例
class Updater : ICommand
{
#region ICommand Members
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(object parameter)
{
//Your Code
}
#endregion
}
<Button x:Name="btnUpdate" Width="100" Height="20" HorizontalAlignment="Center" Grid.Row="1" Content="Update" Command="{Binding Path=UpdateCommand}"/>
加载窗口后,会检查 CanExecute 的返回值 ,如果为真,Button就为enable状态,
Execute 方法准备被调用。如果返回值为假,Button就为disabled.状态
<Button x:Name="btnUpdate" Width="100" Height="20" HorizontalAlignment="Center" Grid.Row="1" Content="Update" Command="{Binding Path=UpdateCommand}" CommandParameter="{Binding ElementName=lstPerson, Path=SelectedItem.Address}">
</Button>
传递参数给 CanExecute and Execute
CanExecuteChanged的任务
CanExecuteChanged通知绑定到该ICommand的任何命令源(如按钮或复选框),CanExecute返回的值已经更改。命令源关心这一点,因为它们通常需要相应地更新它们的状态(例如。如果CanExecute()返回false,按钮将禁用自己。
监听CanExecuteChanged
CommandManager。每当CommandManager认为发生了会影响命令执行能力的更改时,就会引发requerysuggest事件。例如,这可能是控件的焦点的改变。这种事件经常发生。
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}