MVVM ICommand-Implementierung

So, in diesem speziellen MVVM-Implementierung, die ich mache, ich brauche mehrere Befehle. Ich habe wirklich müde von der Implementierung der ICommand-Klassen eins nach dem anderen, und so kam ich auf eine Lösung, aber ich weiß nicht, wie gut es ist, so erfolgt die Preisgabe jeder WPF-Experten hier werden sehr geschätzt. Und wenn Sie könnten, bieten eine bessere Lösung, noch besser.

Was ich getan habe, ist eine einzelne ICommand Klasse und zwei Delegierten, die ein Objekt als parameter, eine Stellvertretung ist nichtig (für OnExecute), die andere bool (für OnCanExecute). So im Konstruktor meiner ICommand (das heißt von der ViewModel-Klasse) sende ich die beiden Methoden, und auf jeden ICommand-Methode rufe ich den Abgeordneten Methoden.

Es funktioniert wirklich gut, aber ich bin mir nicht sicher, ob dies ist ein schlechter Weg, es zu tun, oder ob es einen besseren Weg. Unten ist der komplette code, jede Eingabe wird sehr geschätzt, auch negativ, aber bitte konstruktiv sein.

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
}
InformationsquelleAutor Carlo | 2009-09-23
Schreibe einen Kommentar