2009-10-27 30 views
6

Używam WPF i wzorzec MVVM w moim interfejsie użytkownika. W moim ViewModelu mam listę zawierającą odległości w milimetrach, które wyświetlam w ListView, wiążąc ListView.ItemsSource z Listą. Jednak chciałbym, aby wyświetlane wartości korzystały z bardziej naturalnej jednostki - albo metrów albo stóp, w zależności od stanu pola wyboru "metryczne".WPF i MVVM: Zmiana konwertera powiązania danych w czasie wykonywania

Napisałem kilka prostych klas, MillimetresToMetresConverter i MillimetresToFeetConverter, które implementują IValueConverter. Chociaż mogę ustawić właściwość Konwerter na moim powiązaniu danych z jednym lub drugim, nie jestem pewien, jak zmienić te konwertery, gdy zmienia się stan pola wyboru.

Moim planem było posiadanie pola "IValueConverter lengthConverter" na moim ViewModelu, który mógłbym ustawić na jeden konwerter lub inny, a następnie w moim XAML-ie ...="{Binding Converter={Binding Path=lengthConverter}}" - niestety to nie działa, ponieważ Konwerter nie jest własnością zależności.

Jak zmienić konwerter używany przez wiązanie danych w czasie wykonywania?

+0

Powinieneś być w stanie użyć DependencyObject.GetBinding (DependencyProperty), np. myTextBlock.GetBinding (TextBlock.TextProperty), aby uzyskać (i zmodyfikować) obiekt wiązania. – Heinzi

+0

Niestety, po wzorzec MVVM oznacza, że ​​kod musiałby żyć w ViewModel - który nie ma odniesienia do widoku, a zatem nie może dotknąć "myTextBlock". – user200783

Odpowiedz

0

Jeśli mogę zaproponować proste alternatywne rozwiązanie: Utwórz mały FormatMillimetresConverter w swoim ViewModelu, którego właściwość UseMetric jest powiązana z polem "metryczne".

+0

Dzięki - ale kiedy mam FormatMillimetresConverter w ViewModel, jak mogę ListView go używać? – user200783

+0

Dobra uwaga. :-) Możesz wyeksportować jedną instancję jako statyczną własność ViewModel, a następnie uzyskać do niego dostęp za pośrednictwem "... Converter = {x: Static local: ViewModel.MyFormatMillimetresConverter}", ale jakoś to nie jest zbyt eleganckie ... – Heinzi

+0

A co z tworzeniem FormatMillimetresConverter w ? Następnie jest dostępny jako statyczny zasób i można go dołączyć jako konwerter do ListView.ItemsSource za pomocą "... Converter = {StaticResource ..." i do pola wyboru z "{Binding Source = {StaticResource ...". – Heinzi

5

W większości przypadków podczas korzystania z metodologii MVVM można wykonać zadanie formatowania w klasach maszyn wirtualnych. W twoim przypadku możesz dodać właściwość Format do klasy VM, a na podstawie wartości właściwości Format zwróć dobrze sformatowany ciąg.

Aby uzyskać więcej informacji, patrz this discussion.

+0

Dokładnie. Konwertery są bardzo rzadkie w aplikacjach MVVM, zwykle pojawiają się tylko w niestandardowych kontrolach. –

+0

Załóżmy, że mój ViewModel ma właściwość 'List Distances', do której wiążę mój ListView.ItemsSource. Sugerujesz, że zamiast Distances.get, zwracając listę tak jak jest, powinna zwrócić inną listę - z już zastosowaną konwersją? – user200783

+0

@Paul: tak. ViewModel to tylko trochę ValueConverter ;-). Możesz przeczytać podobną dyskusję na forum dyskusyjnym WPF Disciples: http://groups.google.com/group/wpf-disciples/msg/c29b3935ec9d3c4e –

Powiązane problemy