在自己實現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中。
其界面還是一樣使用上一篇的。