Recientemente estoy tratando de reutilizar algunos elementos de interfaz de usuario en mi solicitud. Cuando comencé a programar con WPF, me dijeron que DataTemplate es la mejor manera de reutilizar los elementos de la interfaz de usuario. Puede definir una plantilla para su entidad de datos y usarla en todas partes. Suena muy bien. Sin embargo, también encontré algunas desventajas, especialmente cuando se compara con UserControl.WPF, control de usuario o DataTemplate
- No se puede reutilizar una DataTemplate definida en otra ventana o UserControl. Por ejemplo, si UserDataTemplate se define en WindowA.xaml, no puede usarlo en WindowB.xaml. La solución podría ser que coloque a DataTemplate como un recurso en un diccionario de recursos global.
- DataTemplate es difícil tener algún código atrás. Como se menciona en el elemento 1, si coloca DataTemplate en ResourceDictionary, no hay lugar para colocar su código de forma predeterminada. Busqué en Google el problema y sí, encontré un truco para hacer que ResourceDictionary tuviera un archivo cs. Pero todavía tiene otro problema.
Otro problema de DataTemplate es que usted debe ser claro con la diferencia entre la instancia de sí mismo DataTemplate y las instancias del contenido de DataTemplate. Un DataTemplate tendrá solo una "instancia de DataTemplate", y puede tener muchas instancias del contenido de DataTemplate. Me explico con un ejemplo:
<DataTemplate> <DataTemplate.Resources> <my:User x:key="User1"/> </DataTemplate.Resources> <Grid MouseLeftButtonDown="OnMouseLeftButtonDown"> <Grid.Resources> <my:User x:key="User2"/> </Grid.Resources> </Grid> </DataTemplate> public partial class CodeBehind { Point mousePos = new Point(); private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { mousePos = e.Pos...; } }
El resultado será que: Usuario1 tendrá solamente un caso, sin embargo, un ejemplo Usuario2 se creará una vez que se aplica el DataTemplate, lo que significa que el usuario 2 tendrá muchas instancias si la plantilla de datos se está aplicando muchas veces. Sin embargo, a diferencia de UserControl, el campo "mousePos" NO tendrá muchas copias. Si el DataTemplate se aplica 100 veces, el mousePos no tendrá 100 copias, lo que significa que las 100 Grids usarán el único campo mousePos al mismo tiempo, lo que puede causar problemas. En UserControl, el campo que haya definido solo será utilizado por el control. 100 instancias de UserControl tendrán 100 copias de campo.
Tal vez estoy usando DataTemplate en el camino equivocado. Cualquier comentario es apreciado.
Saludos,
Zach