2009-06-16 10 views
12

Tengo un DataTemplate Quiero volver a utilizar. La parte que quiero restarle importancia es la encuadernación, porque es lo único que cambia. Mi DataTemplate se ve más o menos así. (De hecho, hay un poco más a él, pero he sacado la materia extraña.)¿Cómo puedo factorizar un enlace de DataTemplate en WPF?

<DataTemplate> 
    <TextBox Text="{Binding Name}" /> 
</DataTemplate> 

¿Cómo puedo volver a utilizar este DataTemplate mientras simplemente variando la propiedad a la que estoy vinculante? (Tenga en cuenta que si fuera tan simple como solo un TextBox, no me preocuparía, pero el DataTemplate en realidad contiene un StackPane l con un número de otros elementos en él. Quiero centralizar eso en un solo lugar, de ahí el DataTemplate .)

He pensado en dos formas de abordar este problema.

  1. Crea un control personalizado simple. Reutilice eso, y no se preocupe por reutilizar el DataTemplate.
  2. Experimenta con algún tipo de subclase de DataTemplate. (Me dijeron que esto es posible). Agregaría una propiedad de dependencia que me permite especificar el nombre de la propiedad a la que quiero enlazar.

Sugerencias?

Respuesta

4

Odio responder mis propias preguntas, pero, para completar, esta es mi solución.

<ListBox ItemsSource="{Binding}"> 
    <ListBox.Resources> 
    <ControlTemplate x:Key="textBoxControlTemplate" TargetType="ContentControl"> 
     <TextBox Text="{TemplateBinding Content}" /> 
    </ControlTemplate> 
    </ListBox.Resources> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <ContentControl Content="{Binding Name}" Template="{StaticResource textBoxControlTemplate}" /> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Esto por supuesto es un muy artificial ejemplo. En mi propia aplicación, en realidad no estoy poniendo cuadros de texto dentro de un cuadro de lista. En un cuadro de lista, esto no es muy útil, pero imagínelo dentro de un DataGrid, donde cada columna se puede mostrar de manera similar, pero se une a una propiedad diferente.

0

Cree un UserControl y úselo dentro de DataTemplate.

<DataTemplate> 
    <local:MyComplexUserControl DataContext="{Binding Name}"/> 
</DataTemplate> 

y en el control de usuario:

<StackPanel> 
    <TextBlock>Value:</Text> 
    <TextBox Text="{Binding}"/> 
</StackPanel> 

Tener un DataTemplate independiente con su propia vinculante para cada ocasión.

+0

Puede hacer esto sin un UserControl que espero, solo con una ControlTemplate en un recurso. –

Cuestiones relacionadas