2009-11-27 30 views
20

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

  1. 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.
  2. 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.
  3. 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

Respuesta

25

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

DataTemplates se trata de aplicar un estilo visual a un DataType. Normalmente, lo que esto significa es 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.

Puedo colocar este DataTemplate en mi aplicación (por ejemplo, en App.XAML) y mi estilo visual se aplicará 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 todo sobre la organización de XAML. Un control de usuario ayuda a organizar fragmentos de XAML que desea reutilizar en su aplicación que tiene comportamientos y funcionalidades vinculados a ella. 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 de múltiples DataTypes y puede incluir comportamientos personalizados.

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

2

Sobre 2.

diría que DataTemplates no están diseñados para ser utilizados con código subyacente. En la mayoría de los casos, solo puede usar el enlace de datos y los comandos para conectar la lógica entre su modelo y su representación. El no tener código reverso también facilita las pruebas unitarias de su aplicación.

10

Personalmente, puedo crear un control de usuario y luego hacer un DataTemplate de eso. Esto tiene para mí las siguientes ventajas:

  1. Se puede utilizar en todas las ventanas, solo mediante la redefinición de la pieza DataTemplate.
  2. Se puede usar código subyacente (lo sé, lo sé, pero algunas cosas son mucho más fácil el uso de código subyacente, no veo el punto en que complica innecesaria mi código basado en el dogma).
  3. Compatibilidad con el diseñador de XAML.
Cuestiones relacionadas