2010-01-18 12 views

Respuesta

9

No estoy al tanto de ninguna manera (no kludgy) para hacer esto: el DataTemplateSelector se llama cuando WPF tiene que seleccionar la plantilla, y eso es una decisión de una sola vez en lo que WPF es preocupado. (Puede evitarlo haciendo que WPF piense que el contenido ha cambiado, por ejemplo, configurando el contenido como nulo y luego de regreso, creo que eso funcionaría, pero no lo ha probado, ¡pero esto es bastante feo!). una buena manera de hacer esto yo también estaría interesado en saberlo!

Sin embargo, hay una manera alternativa de cambiar cómo se muestra el contenido que hace la actualización en respuesta a los cambios de datos, y eso es a través de activadores. Puede usar DataTriggers en su colección DataTemplate.Triggers para mostrar y ocultar elementos en función de los datos de contenido. Para cambiar toda la pantalla, podría, por ejemplo, configure dos representaciones en una cuadrícula, y use disparadores para controlar cuál es visible. Incluso podría hacer que su plantilla de datos sea ContentControl y usar un activador para cambiar ContentTemplate. Por supuesto, esto depende de los criterios para cambiar la plantilla de propiedades enlazables, lo que puede no ser siempre el caso.

Here's some brief discussion of selectors vs. triggers, aunque en un contexto ligeramente diferente.

+1

Tengo problemas al usarlo con DataTrigger, eche un vistazo: http://stackoverflow.com/questions/2090148/unable-to-set-contenttemplate-via-datatrigger – Shimmy

18

Tarde en la fiesta, lo sé. =)

Cuando se enfrentan a este problema, me pareció más fácil de establecer explícitamente un nuevo TemplateSelector como

MyContentControl.ContentTemplateSelector = 
    new MyDataTemplateSelector(); 
+0

1 nunca es demasiado ¡tarde! a diferencia de otras publicaciones, que son deprimentes, porque te dicen que no hay forma de hacer lo que quieres, tu solución funciona, y me dieron una gran idea, la publicaré en un momento, cuando tenga tiempo hoy. –

+0

Lo que realmente hice fue almacenar cada presentador que llama a SelectTemplate (como una referencia débil) en mi DataTemplateSelector y proporcionar un método estático para actualizar todo esto. – Jens

+0

¡agradable! ¡gracias de nuevo! –

7

supongo que soy incluso más tarde a la fiesta, pero para una idea diferente que puede ayudar a alguien. ..

También podría intentar usar un ValueConverter en la propiedad ContentControl s ContentTemplate en lugar de DataTemplateSelector.

Solo tiene una propiedad en su DataContext para enlazar, como ScreenNumber por ejemplo. Luego, en el ValueConverter devuelva el DataTemplate que está asociado con el ScreenNumber.

3

Similar a la respuesta de Jens, en lugar de crear una nueva instancia, puede usar la instancia existente de DataTemplateSelector.

var currentSelector = MyContentControl.ContentTemplateSelector;  
MyContentControl.ContentTemplateSelector = null; 
MyContentControl.ContentTemplateSelector = currentSelector; 
Cuestiones relacionadas