Mvvm(3) : ICommand

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章