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 № 1Chcemy 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 ICommand
Wolał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.