所以在這個特定的MVVM實現中,我需要幾個命令。我真的厭倦了逐個實現ICommand類,所以我想出了一個解決方案,但我不知道它有多好,所以任何WPF專家的輸入將不勝感激。如果你能提供更好的解決方案,甚至更好!WPF ICommand MVVM實現
我所做的是一個ICommand類和兩個委託,它們將一個對象作爲參數,一個委託是void(用於OnExecute),另一個是用於OnCanExecute的bool。所以在我的ICommand(由ViewModel類調用)的構造函數中,我發送了兩個方法,並在每個ICommand方法上調用委託的方法。
它的工作非常好,但我不確定這是否是一種不好的方法,或者如果有更好的方法。以下是完整的代碼,任何輸入將不勝感激,甚至是消極的,但請具有建設性。
謝謝!
視圖模型:
public class TestViewModel : DependencyObject
{
public ICommand Command1 { get; set; }
public ICommand Command2 { get; set; }
public ICommand Command3 { get; set; }
public TestViewModel()
{
this.Command1 = new TestCommand(ExecuteCommand1, CanExecuteCommand1);
this.Command2 = new TestCommand(ExecuteCommand2, CanExecuteCommand2);
this.Command3 = new TestCommand(ExecuteCommand3, CanExecuteCommand3);
}
public bool CanExecuteCommand1(object parameter)
{
return true;
}
public void ExecuteCommand1(object parameter)
{
MessageBox.Show("Executing command 1");
}
public bool CanExecuteCommand2(object parameter)
{
return true;
}
public void ExecuteCommand2(object parameter)
{
MessageBox.Show("Executing command 2");
}
public bool CanExecuteCommand3(object parameter)
{
return true;
}
public void ExecuteCommand3(object parameter)
{
MessageBox.Show("Executing command 3");
}
}
的ICommand:
public class TestCommand : ICommand
{
public delegate void ICommandOnExecute(object parameter);
public delegate bool ICommandOnCanExecute(object parameter);
private ICommandOnExecute _execute;
private ICommandOnCanExecute _canExecute;
public TestCommand(ICommandOnExecute onExecuteMethod, ICommandOnCanExecute onCanExecuteMethod)
{
_execute = onExecuteMethod;
_canExecute = onCanExecuteMethod;
}
#region ICommand Members
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
return _canExecute.Invoke(parameter);
}
public void Execute(object parameter)
{
_execute.Invoke(parameter);
}
#endregion
}
查看Karl Shifflet的RelayCommand實現:http://www.codeproject.com/KB/WPF/ExploringWPFMVVM.aspx – 2009-09-24 00:26:03