Konfiguruję ContentControl.DataTemplateSelector na żądaną.
Chcę to zgodnie z poleceniem lub cokolwiek, wywołaj ContentControl, aby ponownie wybrać szablon z selektora przez xaml lub kod.Jawnie odświeżyć DataTemplate z DataTemplateSelector?
Thank
Konfiguruję ContentControl.DataTemplateSelector na żądaną.
Chcę to zgodnie z poleceniem lub cokolwiek, wywołaj ContentControl, aby ponownie wybrać szablon z selektora przez xaml lub kod.Jawnie odświeżyć DataTemplate z DataTemplateSelector?
Thank
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.
Późno na imprezę, wiem. =)
W obliczu tego problemu, znalazłem to najprostszy jawnie ustawić nowy TemplateSelector jak
MyContentControl.ContentTemplateSelector =
new MyDataTemplateSelector();
+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. –
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
nice! Jeszcze raz dziękuję! –
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
.
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;
Mam problemy z użyciem DataTrigger, proszę spojrzeć: http://stackoverflow.com/questions/2090148/unable-to-set-contenttemplate-via-datatrigger – Shimmy