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
}
- Check-out von Karl Shifflet Umsetzung von RelayCommand: codeproject.com/KB/WPF/ExploringWPFMVVM.aspx
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist fast identisch wie Karl Shifflet gezeigt eine
RelayCommand
, woExecute
feuert einen vorbestimmtenAction<T>
. Eine erstklassige Lösung, wenn Sie mich Fragen.Diese könnten dann verwendet werden, als...
Lesen Sie mehr:
Josh Smith (introducer von
RelayCommand
): - Muster-und WPF-Anwendungen Mit Dem MVVM Design Pattern_doSomething
wenn es nicht bereits instanziiert wurde.Ich habe dies geschrieben Artikel über die ICommand-Schnittstelle.
Die Idee, die Schaffung einer universellen Befehl, der zwei Delegierten: der eine wird aufgerufen, wenn
ICommand.Execute (object param)
aufgerufen wird, die zweite prüft den status, ob Sie den Befehl ausführen(ICommand.CanExecute (object param))
.Erfordert die Methode Schaltvorgang
CanExecuteChanged
. Es wird aufgerufen, aus dem Elemente der Benutzeroberfläche für die Umschaltung der StaatCanExecute()
Befehl.Ich habe gerade ein wenig Beispiel zeigen, wie Befehle zu implementieren, die in der Konvention über die Konfiguration. Allerdings Bedarf es der Reflexion.Emit() verfügbar sein. Die unterstützenden code mag ein wenig seltsam, aber einmal geschrieben, es kann viele Male verwendet werden.
Teaser:
}
UPDATE: jetzt scheint es zu existieren einige Bibliotheken, wie die http://www.codeproject.com/Articles/101881/Executing-Command-Logic-in-a-View-Model das löst das problem der ICommand-boilerplate-code.
@Carlo ich mag deine Umsetzung dieses, aber ich wollte meine version und wie es zu benutzen in meinem ViewModel
Ersten ICommand implementieren
Bemerken, ich habe entfernt die parameter aus ICommandOnExecute und ICommandOnCanExecute und fügte hinzu, eine null im Konstruktor
Nutzen Sie dann im ViewModel
Ich finde einfach diese Art und Weise sauberer als ich brauche nicht zu Variablen zuweisen und dann instanziieren, es alles in einem Rutsch.