Cambiar plantillas de datos en tiempo de ejecución & # 8211; problema de actualización

StackOverflow https://stackoverflow.com/questions/320219

  •  11-07-2019
  •  | 
  •  

Pregunta

Utilizo la arquitectura MVVM para desacoplar mi aplicación. Es decir, a menudo ves algo como

var u = new UserControl();
u.Content = new MyCustomType(); // MyCustomType is not a control

La IU se define mediante plantillas de datos que residen en diccionarios de recursos en sus propios archivos XAML

<ResourceDictionary ...>
    <DataTemplate DataType="{x:Type local:MyCustomType}">
        ...

Carga los recursos al inicio de la aplicación y la aplicación se complace en mostrar mi interfaz de usuario. Pero si elimino una plantilla de datos y agrego una nueva (misma clave, mismo tipo de datos), la interfaz de usuario todavía usa la plantilla de datos anterior. Por supuesto, puedo volver a configurar el contenido de mi contenedor para forzar una actualización, pero esto parece una tontería porque tengo que notificar a cada control sobre un cambio, como este

var tmp = control.Content;
control.Content = null;
control.Content = tmp; // New data template will be used

¿Algún otro enfoque?

¿Fue útil?

Solución

Esto se debe a que los recursos son estáticos en su diccionario. Una vez que se hayan utilizado, no se actualizarán. Podría intentar volver a cargar los diccionarios, pero eso solo actualizará los nuevos controles, no los antiguos.

Si desea admitir múltiples DataTemplates, puede considerar la clase DataTemplateSelector, que seleccionará una plantilla de acuerdo con sus condiciones: http://msdn.microsoft.com/en- us / library / system.windows.controls.datatemplateselector.aspx

Si necesita cambiar las plantillas 'sobre la marcha', siempre puede considerar el uso de ControlTemplates y una propiedad Binding for Template de su control ...

{Binding Converter={StaticResource YourAwesomeTemplateSwitcherConverter}}

HTH

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top