wpf user-controls datatemplate

WPF, UserControl o DataTemplate



user-controls (3)

Recientemente estoy tratando de reutilizar algunos elementos de la interfaz de usuario en mi aplicación. 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.

  1. No puede reutilizar un DataTemplate definido en otra ventana o UserControl. Por ejemplo, si UserDataTemplate está definido en WindowA.xaml, no puede usarlo en WindowB.xaml. La solución podría ser que coloque el DataTemplate como un recurso en un Diccionario de recursos global.
  2. DataTemplate es difícil tener algún código detrás. Como se mencionó en el elemento 1, si coloca la plantilla de datos en un ResourceDictionary, no hay lugar para poner su código de manera predeterminada. Busqué en Google el problema y sí, encontré un truco para hacer que el ResourceDictionary tenga un archivo cs. Pero todavía tiene otro problema.
  3. Otro problema de DataTemplate es que debe ser claro con la diferencia entre la instancia de DataTemplate en sí y las instancias del contenido de DataTemplate. Una DataTemplate tendrá solo una "instancia de DataTemplate" y puede tener muchas instancias del contenido de la DataTemplate. Déjame explicarlo 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 solo tendrá una instancia, sin embargo, una instancia de Usuario2 se creará una vez que se aplique la Plantilla de datos, lo que significa que el Usuario2 tendrá muchas instancias si la placa de datos se aplica 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 cuadrículas usarán el único campo mousePos al mismo tiempo, lo que puede causar problemas. En UserControl, el campo que definió solo será utilizado por el control. 100 instancias de UserControl tendrán 100 copias de campo.

Tal vez estoy usando DataTemplate de la manera incorrecta. Cualquier comentario es apreciado.

Atentamente,

Zach


Conceptualmente, DataTemplates y UserControls resuelven dos problemas diferentes. No son realmente intercambiables, por lo que sus comparaciones no son realmente precisas.

Los DataTemplates tienen que ver con la aplicación de un estilo visual a un DataType. Por lo general, esto significa que tengo mi propia clase .NET llamada Foo y quiero darle un estilo visual. Haría esto creando un DataTemplate con un DataType de Foo.

Luego puedo colocar este DataTemplate en mi aplicación (por ejemplo, en App.XAML) y aplicaré mi estilo visual a mi objeto de datos Foo donde sea que se use. A menudo, esto significa que verá un ContentControl que tiene una propiedad de contenido vinculada a una propiedad de tipo Foo.

UserControls en el otro tenía que ver con la organización de XAML. Un control de usuario ayuda a organizar los fragmentos de XAML que desea reutilizar a lo largo de su aplicación que tengan comportamientos y funcionalidades vinculadas a ellos. Esto es más de lo que hará un DataTempate.

Un DataTemplate está vinculado a un DataType y muestra un visual para ese tipo. Un UserControl puede estar compuesto por varios DataTypes y puede incluir comportamientos personalizados.

Dicho esto, rara vez encuentro la necesidad de un UserControl. Utilizo DataTemplates para modelar mis datos e implementar mis comportamientos a través de enlaces de datos y el patrón MVVM.


Personalmente, creo un UserControl y luego hago una DataTemplate a partir de eso. Esto tiene que seguir las siguientes ventajas, para mí:

  1. Se puede usar en todas las ventanas, solo al redefinir la parte DataTemplate.
  2. Puedo usar código detrás (lo sé, lo sé, pero algunas cosas son mucho más fáciles usando el código detrás, no veo el punto de complicar innecesariamente mi código basado en dogma).
  3. Soporte del diseñador XAML.

Sobre 2.

Yo diría que los DataTemplates no están diseñados para usarse con el código subyacente. La mayoría de los casos solo puede usar DataBinding y Commands para conectar la lógica entre su modelo y su representación. No tener código detrás también facilita las pruebas unitarias de su aplicación.