/ / Jak mogę dodać nowe polecenie do zdarzenia kontrolnego - wpf, mvvm

Jak mogę dodać nowe polecenie do zdarzenia kontrolnego - wpf, mvvm

dzięki za przyjrzenie się temu pytaniu.

Budowałem aplikację (VB / WPF) zgodnie z przykładem Josh Smitha z wzorem MVVM: Kliknij tu by zobaczyc

Moje widoki mają elementy sterujące, które wyzwalają polecenie po zdarzeniu, takie jak kliknięcie przycisku i są one powiązane z właściwościami w ViewModel.

Mój ViewModel udostępnia właściwości typu ICommand, które wywołują odpowiednie metody.

To działało dobrze, aż do teraz! Teraz chcę użyć Kontrolki Kciuka, aby umożliwić użytkownikowi przesuwanie obiektu w obszarze roboczym. Nie wierzę, że Thumb ma zdolność dowodzenia „z pudełka” Kciuk podnosi wydarzenie „DragDelta” podczas przenoszenia.

Jak mogę rozszerzyć zdolność Kontroli do wydania Polecenia w przypadku zdarzenia?

Chcę wydać nowe polecenie, powiedzmy „onDragDelta”, aby móc powiązać go z właściwością w moim ViewModelu, tak jak moje przyciski.

Dziękuję Ci bardzo

Odpowiedzi:

3 dla odpowiedzi № 1

Chcemy wystrzelić komendę IC w swoim ViewModelu na podstawie RoutedEvent FrameworkElement. Niestety, WPF nie obsługuje tego „out-of-box”. Niektóre możliwości:

1) W Expression Blend 3 znajduje się Microsoft.Expression.Interactivity.dll, który to umożliwia. Widzieć WPF: Blend 3 Interactions / Behaviors na przykład, jak to zrobić.

2) Możesz mieć moduł obsługi zdarzeń w swoim kodowaniu, który bezpośrednio wywołuje odpowiednie polecenie ViewModel. Na przykład:

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

3) Jako część Cinch ramy, istnieje dołączone zachowanie polecenia. W ten sposób nie musisz zmieniać kodu. Na przykład:

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

Zauważ, że wywołuje to komendę ICommand i przekazuje obiekt (właściwie SCommandArgs) jako parametr polecenia. Aby uzyskać rzeczywiste argumenty zdarzenia routowanego w programie obsługi poleceń, wykonaj następujące czynności:

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

EDYCJA: Zobacz również Powiązanie poleceń z wydarzeniami?


0 dla odpowiedzi nr 2

Zamiast korzystać z ICommandWolałbym raczej powiązanie danych aktualna pozycja Thumb do właściwości w ViewModel. Teraz, jeśli pozycja zostanie zmieniona, możesz wykonać jakąś metodę w ViewModelu z różnicą jako parametr.

Nie wiem, czy to pasuje do twoich potrzeb, ale to była moja pierwsza myśl.