2011-10-24 21 views
5

Tengo un cuadro de lista WPF que contiene un control de usuario llamado JUC.WPF Lista de los diferentes tipos de controles de usuario

Esto funciona muy bien y como soy nuevo en WPF, esto ya es muy impresionante. Lo que me gustaría hacer ahora es tener diferentes controles de usuario en la lista basados ​​en una propiedad vinculada.

¿Esto es posible? Si no, ¿de qué otra manera podría lograr esto?

Estoy usando una lista porque quiero permitir el orden de soltar/arrastrar los controles del usuario, y habrá un número variable, por lo que parece tener sentido: los enfoques alternativos son bienvenidos.

<ListBox x:Name="peopleListBox" 
    HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch" 
    ItemContainerStyle="{StaticResource ListBoxItemStretch}" 
    Foreground="Transparent" 
    BorderBrush="Transparent" 
    Background="Transparent" 
    Grid.ColumnSpan="2" SelectionChanged="peopleListBox_SelectionChanged"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <my:JUC Margin="4"></my:JUC> 
       </Grid> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Respuesta

7

Usted puede utilizar DataTemplateSelector, en SelectTemplate() método que se puede comprobar qué DataTemplate a utilizar para este momento pasado en el ítem:

En XAML:

<!-- define templates in resources 
    ChartDataTemplate is a ChartDataTemplate.xaml, the same for other 
--> 
<UserControl.Resources> 
    <DataTemplate x:Key="ChartDataTemplate"> 
      <views:LineChartView /> 
    </DataTemplate> 

    <DataTemplate x:Key="GridDataTemplate"> 
     <views:PieChartView /> 
    </DataTemplate> 
</UserControl.Resources> 

<!-- ListView Itemtemplate should point to template selector --> 
<ItemsControl.ItemTemplate>  
    <DataTemplate> 
     <ContentPresenter 
      ContentTemplateSelector = "{StaticResource MyTemplateSelector}"> 

En Código atrás:

private sealed class MyTemplateSelector: DataTemplateSelector 
{ 

    public override DataTemplate SelectTemplate(
             object item, 
             DependencyObject container) 
    { 
     // 1. case item to your object which is bound to each ListView item 
     // 2. based on object type/state return correct DataTemplate 
     // as this.Resources["ChartDataTemplate"] or 
     // this.Resources["GridDataTemplate"] 
    } 
    } 
+0

¡Muchas gracias! – Jonno

Cuestiones relacionadas