2010-04-19 8 views
7

Zwykle, gdy chcesz, aby kontrolka databuntów aktualizowała się, używasz zdarzenia "PropertyChanged", aby zasygnalizować interfejsowi, że dane zmieniły się za kulisami.Aktualizacja powiązania WPF po powiązaniu bezpośrednio z DataContext w konwerterze

Na przykład można mieć textblock, który jest związany z datacontext z właściwością "displayText"

<TextBlock Text="{Binding Path=DisplayText}"/>

Stąd, jeżeli DataContext zgłasza zdarzenie PropertyChanged z propertyName "displayText", a następnie ten tekst bloku tekstowego powinien zostać zaktualizowany (zakładając, że nie zmieniono trybu wiązania).

Jednak mam bardziej skomplikowane powiązanie, które wykorzystuje wiele właściwości poza datacontextem w celu określenia ostatecznego wyglądu i działania kontrolki. Aby to osiągnąć, wiążę się bezpośrednio z datacontextem i używam konwertera. W tym przypadku pracuję ze źródłem obrazu.

<Image Source="{Binding Converter={StaticResource ImageConverter}}"/>

Jak widać, używam {Binding} bez ścieżki wiązać bezpośrednio do datacontext, i używam ImageConverter aby wybrać obraz, którego szukam. Ale teraz nie mam sposobu (o którym wiem), aby powiedzieć, że zobowiązanie do aktualizacji. Próbowałem podnieść propertychanged event z "." jako nazwa właściwości, która nie działała.

Czy to możliwe? Czy muszę zawinąć logikę konwertującą w właściwość, do której można dołączyć powiązanie, lub czy istnieje sposób powiadomienia wiązania o odświeżeniu (bez wyraźnego odświeżania wiązania)?

Każda pomoc zostanie bardzo doceniona. Dzięki! -Adam

Odpowiedz

17

Rozwiązaniem tutaj było dodać obiekt do mojego obiektu (do wykorzystania jako datacontext) o nazwie „Self”, które po prostu wrócił

public Object Self { get { return this; }}

Następnie w wiązaniu Kiedyś tę właściwość:

<Image Source="{Binding Path=Self, Converter={StaticResource ImageConverter}}"/>

Wtedy gdy zgłoszę

PropertyChanged(this, new PropertyChangedEventArgs("Self"))

działa jak urok.

Dzięki wszystkim.

+0

DZIĘKUJEMY! Byłem szalony, szukając tego i chciałem go zapytać, kiedy pojawiło się na moich sugestiach – HDD

0

Hmm, nie pokazujesz pełnej implementacji. Ale myślę, że powinien zaktualizować, jeśli wartość związana z GUI dostarcza zdarzenia PropertyChanged.

Pozdrowienia

+0

Problem polega na tym, że źródło obrazu jest bezpośrednio związane z formatem danych, a nie właściwością datacontext. Konwerter przyjmuje datakekst i zwraca źródło obrazu. Aby wyjaśnić, aktualizacja występuje (działa), jeśli używam powiązania, które ma ścieżkę do właściwości datacontext, a następnie wywołanie właściwości PropertyChanged dla tej właściwości. Potrzebuję jednak samego obiektu do określenia obrazu (więcej niż tylko własność). Dzięki. – Adam

+0

pomyślał podczas pisania tego. Spróbuję umieścić właściwość na moim obiekcie o nazwie "Self", która po prostu się zwraca, a następnie wywołuje PropertyChanged ("Self"). Dam ci ten strzał. – Adam

2

nie wierzę, nie jest sposobem osiągania dokładnie to, czego potrzebujesz z aktualnym konwertera. Jak wspomniałeś, możesz wykonać obliczenia w swoim ViewModelu, lub możesz zmienić konwerter na IMulitValueConverter.

Z konkretnego scenariusza (konwerter związany z klasą ViewModel i kilkoma jego właściwościami), chciałbym skłaniać się do implementacji logiki w ViewModel.