2010-01-18 14 views

Odpowiedz

9

nie jestem świadomy jakiegokolwiek (non-kludgy) sposób to zrobić: the DataTemplateSelector nazywa kiedy WPF musi wybrać szablon, a to jednorazowa decyzja miarę WPF jest zaniepokojony. (Możesz go usunąć, sprawiając, że WPF sądzi, że zawartość się zmieniła, np. Ustawiając zawartość na null, a następnie z powrotem - myślę, że to by działało, ale nie testowałem - ale to jest dość brzydkie!) Jeśli jest fajny sposób na zrobienie tego również chciałbym wiedzieć!

Istnieje jednak alternatywny sposób zmiany sposobu wyświetlania zawartości, która jest aktualizowana w odpowiedzi na zmiany danych, i to przez wyzwalacze. Można użyć funkcji DataTrigger w kolekcji DataTemplate.Triggers, aby wyświetlać i ukrywać elementy w zależności od danych zawartości. Aby zmienić cały ekran, możesz np. ustaw dwa renderingi w siatce i użyj wyzwalaczy, aby kontrolować, który z nich jest widoczny. Możesz nawet uczynić szablon danych narzędziem ContentControl i użyć wyzwalacza do zmiany ContentTemplate. Oczywiście zależy to od kryteriów zmiany szablonu, które są właściwościami wiążącymi, co nie zawsze musi mieć miejsce.

Here's some brief discussion of selectors vs. triggers, aczkolwiek w nieco innym kontekście.

+1

Mam problemy z użyciem DataTrigger, proszę spojrzeć: http://stackoverflow.com/questions/2090148/unable-to-set-contenttemplate-via-datatrigger – Shimmy

18

Późno na imprezę, wiem. =)

W obliczu tego problemu, znalazłem to najprostszy jawnie ustawić nowy TemplateSelector jak

MyContentControl.ContentTemplateSelector = 
    new MyDataTemplateSelector(); 
+0

+1 nigdy nie jest zbyt późno! w przeciwieństwie do innych postów, które są przygnębiające, ponieważ mówią, że nie ma sposobu, aby zrobić to, co chcesz! Twoje rozwiązanie działa, i dało mi świetny pomysł, opublikuję go trochę, kiedy mam dzisiaj czas. –

+0

To, co faktycznie zrobiłem, to przechowywanie każdego prezentera, który wywołuje SelectTemplate (jako słaby punkt odniesienia) w moim DataTemplateSelector i zapewnia statyczną metodę odświeżenia tych wszystkich. – Jens

+0

nice! Jeszcze raz dziękuję! –

7

Chyba jestem jeszcze później do partii, ale na inny pomysł, że może komuś pomóc. ..

Można również spróbować użyć opcji ValueConverter dla właściwości ContentControl s ContentTemplate zamiast z DataTemplateSelector.

Wystarczy mieć właściwość w swoim DataContext, aby związać, na przykład ScreenNumber. Następnie w polu ValueConverter jest zwracana wartość DataTemplate powiązana z ScreenNumber.

3

Podobnie jak w przypadku Jens, zamiast tworzyć nową instancję, można użyć istniejącej instancji obiektu DataTemplateSelector.

var currentSelector = MyContentControl.ContentTemplateSelector;  
MyContentControl.ContentTemplateSelector = null; 
MyContentControl.ContentTemplateSelector = currentSelector; 
Powiązane problemy