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; }
}