したがって、私が行っているこの特定のMVVM実装では、いくつかのコマンドが必要です。ICommandクラスを1つずつ実装するのに本当にうんざりしていたので、解決策を考え出しましたが、それがどれほど優れているかわからないので、ここでのWPFエキスパートの意見をいただければ幸いです。そして、あなたがより良い解決策を提供できれば、さらに良いでしょう。
私が行ったのは、単一のICommandクラスと、オブジェクトをパラメーターとして受け取る2つのデリゲートです。1つのデリゲートはvoid(OnExecuteの場合)、もう1つのデリゲートは(OnCanExecuteの場合)です。したがって、ICommandのコンストラクター(ViewModelクラスによって呼び出されます)で2つのメソッドを送信し、各ICommandメソッドでデリゲートのメソッドを呼び出します。
それは本当にうまくいきますが、これがそれを行うのに悪い方法なのか、それとももっと良い方法があるのかはわかりません。以下は完全なコードです。否定的であっても、どんな入力でも大歓迎ですが、建設的にしてください。
ViewModel:
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
}