/ / Wie kann ich dem Ereignis eines Steuerelements einen neuen Befehl hinzufügen? - wpf, mvvm

Wie kann ich dem Ereignis eines Steuerelements einen neuen Befehl hinzufügen - wpf, mvvm

Vielen Dank, dass Sie sich diese Frage angesehen haben.

Ich habe eine Anwendung (VB / WPF) nach Josh Smiths Beispiel für ein MVVM-Muster erstellt: Klicke hier, um anzusehen

Meine Ansichten haben Steuerelemente, die bei einem Ereignis einen Befehl auslösen, z. B. bei einem Tastenklick, und diese sind an Eigenschaften im ViewModel gebunden.

My ViewModel macht Eigenschaften vom Typ ICommand verfügbar, die die entsprechenden Methoden aufrufen.

Das hat bis jetzt gut funktioniert! Ich möchte nun ein Thumb-Control verwenden, um einem Benutzer das Verschieben eines Objekts innerhalb eines Canvas-Bereichs zu ermöglichen. Ich glaube nicht, dass der Thumb eine Befehlsfunktion "out of the box" hat. Ein Thumb löst beim Verschieben ein "DragDelta" -Ereignis aus. Meine Frage lautet also wie folgt:

Wie erweitere ich die Fähigkeit eines Controls, bei einem Ereignis einen Befehl zu erteilen?

Ich möchte einen neuen Befehl ausgeben, sagen wir "onDragDelta", damit ich ihn wie meine Schaltflächen an eine Eigenschaft in meinem ViewModel binden kann.

Vielen Dank

Antworten:

3 für die Antwort № 1

Sie möchten einen ICommand in Ihrem ViewModel auslösen, der auf dem RoutedEvent eines FrameworkElement basiert. Leider unterstützt WPF diesen "Out-of-Box" nicht. Einige Möglichkeiten:

1) Mit Expression Blend 3 gibt es Microsoft.Expression.Interactivity.dll, die dies ermöglicht. Sehen WPF: Mische 3 Interaktionen / Verhaltensweisen Ein Beispiel dazu.

2) Sie könnten einen Ereignishandler in Ihrem Code-Behind haben, der direkt den entsprechenden ViewModel-Befehl aufruft. Zum Beispiel:

private void FrameworkElement_DragDelta(object sender, EventArgs e)
{
this.MyViewModel.OnDragDelta(sender, e);
}

3) Im Rahmen der Cinch Rahmen gibt es eine angefügtes Befehlsverhalten. Auf diese Weise müssen Sie Ihren Code-Behind nicht ändern. Zum Beispiel:

Cinch:SingleEventCommand.RoutedEventName="DragDelta"
Cinch:SingleEventCommand.TheCommandToRun="{Binding Path=DragDeltaCommand}"

Beachten Sie, dass dies einen ICommand aufruft und ein Objekt (eigentlich ein SCommandArgs) als Befehlsparameter übergibt. Gehen Sie folgendermaßen vor, um die tatsächlichen Argumente für weitergeleitete Ereignisse in Ihrem Befehlshandler abzurufen:

var sargs = args as SCommandArgs;
if (sargs == null)
{
return;
}

var routedEventArgs = sargs.EventArgs as RoutedEventArgs; // Or whatever arguments you actually expect
if (routedEventArgs == null)
{
return;
}

// Do something here with the event arguments

EDIT: Schauen Sie sich auch an Befehle an Ereignisse binden?


0 für die Antwort № 2

Anstelle einer ICommand, Ich würde lieber Daten binden Die aktuelle Position des Daumens zu einer Eigenschaft in Ihrem ViewModel. Wenn nun die Position geändert wird, können Sie eine Methode in Ihrem ViewModel mit dem Unterschied als Parameter ausführen.

Ich weiß nicht, ob dies Ihren Bedürfnissen entspricht, aber das war mein erster Gedanke.