在自己實現MVVM時,上一篇的實現方式基本是不用,因其對於命令的處理不夠方便,沒寫一個命令都需要另加一個Command的類。此篇主要介紹DelegateCommand來解決上面所遇到的問題。
首先,我們創建自己的DelegateCommand。
代碼如下:
/// <summary> /// 實現DelegateCommand /// </summary> class MyDelegateCommand : ICommand { /// <summary> /// 命令所需執行的事件 /// </summary> public Action<object> ExecuteCommand { get; set; } /// <summary> /// 命令是否可用所執行的事件 /// </summary> public Func<object, bool> CanExecuteCommand { get; set; } public MyDelegateCommand() { } public MyDelegateCommand(Action<object> execute, Func<object, bool> canexecute) { ExecuteCommand = execute; CanExecuteCommand = canexecute; } /// <summary> /// 命令可用性獲取 /// </summary> /// <param name="parameter"></param> /// <returns></returns> public bool CanExecute(object parameter) { return CanExecuteCommand(parameter); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } /// <summary> /// 命令具體執行 /// </summary> /// <param name="parameter"></param> public void Execute(object parameter) { ExecuteCommand(parameter); } }
其中的重點是利用兩個委托,將方法的實現分離出去,接下來看我們的ViewModel:
class TestViewModel : INotifyPropertyChanged { private string teststr; /// <summary> /// 待通知字符串 /// </summary> public string TestStr { get { return teststr; } set { teststr = value; RaiseChanged("TestStr"); } } /// <summary> /// 測試命令 /// </summary> public ICommand TestCommand { get; set; } public TestViewModel() { TestCommand = new MyDelegateCommand(); (TestCommand as MyDelegateCommand).ExecuteCommand = Test; (TestCommand as MyDelegateCommand).CanExecuteCommand = CanTest; //or //TestCommand = new MyDelegateCommand(Test, CanTest); } int i = 0; /// <summary> /// testcommand執行的方法 /// </summary> /// <param name="para"></param> private void Test(object para) { i++; TestStr = i.ToString(); } /// <summary> /// testcommand是否可用 /// </summary> /// <param name="para"></param> /// <returns></returns> private bool CanTest(object para) { return true; } #region INotifyPropertyChanged接口實現 public void RaiseChanged(string propertyname) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyname)); } } public event PropertyChangedEventHandler PropertyChanged; #endregion }
其中的Test,CanTest就是之前寫在Command中的實現,通過此實現,我們可以將界面呈現邏輯全部集中到ViewModel中。
其界面還是一樣使用上一篇的。