2011-03-31 5 views
0

Je souhaite lier sélectivement des données d'une collection à différents éléments de l'interface utilisateur. Par exemple, j'ai une collection d'objets où chaque objet a une propriété qui décrit le type de cet objet. J'utilise actuellement un DataTemplate pour catégoriser les éléments. Mais lorsque je propose la collection à deux conteneurs d'interface utilisateur différents malgré la disponibilité de DataTemplates, les objets sont ajoutés aux deux conteneurs. code suivant rendrait la question plus claire:Liaison sélective de données à une collection

Vue:

données Modèles:

 <DataTemplate x:Key="ColumnDataTemplate"> 
     <Label DataContext="{Binding ColumnDiscriptor}" Foreground="White" Background="DarkOrange" BorderThickness="5"> 
      <TextBlock Text="{Binding ColumnName}"> 
      <!--<Run Text="{Binding TableName}"/><Run Text="."/><Run Text="{Binding ColumnName}"/>--> 
      </TextBlock> 
     </Label> 
    </DataTemplate> 
    <DataTemplate x:Key="ControllerDataTemplate"> 
     <Label Content="{Binding OperatorValue}" Foreground="White" Background="Crimson" BorderThickness="5"> 
     </Label> 
    </DataTemplate> 
    <DataTemplate x:Key="ValueDataTemplate"> 
     <TextBox Text="{Binding Path=ComparedValue, Mode= TwoWay}" Height="24" HorizontalAlignment="Left" Width="46" /> 
    </DataTemplate> 

    <DataTemplate x:Key="JoinDataTemplate"> 
      <Grid> 
      <!--<Run Text="{Binding TableName}"/><Run Text="."/><Run Text="{Binding ColumnName}"/>--> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="80*"/> 
       </Grid.RowDefinitions> 

       <Label Grid.Row="0" Grid.Column="0" DataContext="{Binding ColumnDiscriptor}" Foreground="Black" Background="Brown" BorderThickness="5"> 
        <TextBlock Text="{Binding ColumnName}"> 
        </TextBlock> 
       </Label> 

      <Label Grid.Row="0" Grid.Column="1" DataContext="{Binding JoinWithColumnDescriptor}" Foreground="Black" Background="Beige" BorderThickness="5"> 
       <TextBlock Text="{Binding Path=ColumnName}"> 
        </TextBlock> 
       </Label> 
      </Grid> 
    </DataTemplate> 

<local:QueryObjectDataTemplateSelector x:Key="ModelSelector" 
             ColumnTemplate="{StaticResource ColumnDataTemplate}" 
             ControllerTemplate="{StaticResource ControllerDataTemplate}" 
             ValueTemplate="{StaticResource ValueDataTemplate}" 
             /> 

conteneurs UI:

<ListBox Height="146" HorizontalAlignment="Left" Margin="12,38,0,0" Name="visulaqueryPanel" VerticalAlignment="Top" Width="344" Background="#18EBEBE2" AllowDrop="True" Drop="Item_Drop" DragEnter="Item_DragEnter" ItemsSource="{Binding ViewUIElements}" ItemsPanel="{StaticResource WrapPanelTemplate}" 
       ItemTemplateSelector="{StaticResource ModelSelector}" SelectedItem="{Binding Path=SelectedDesignerVisualQueryObject}"/> 

<ListBox AllowDrop="True" Background="#1CFFFFFF" Margin="10,38,6,39" Name="grid1" Drop="Join_Item_Drop" DragEnter="Item_DragEnter" ItemsSource="{Binding ViewUIElements}" ItemTemplate="{StaticResource JoinDataTemplate}" SelectedItem="{Binding Path=SelectedDesignerVisualQueryObjectJoin}" /> 

Selon mon problème ViewUIElemetns est la collection qui se composent de les objets qui sont de types différents.

Merci d'avance.

Répondre

1

définissent simplement différentes DataTemplates en fonction du type:

<DataTemplate DataType="{x:Type SomeType1}"> 
... 
</DataTemplate> 

<DataTemplate DataType="{x:Type SomeType2}"> 
... 
</DataTemplate> 

si vous devez le faire par la propriété et non par type, alors u doit utiliser DataTemplateSelector: http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselector

+0

Salut Elad, je vous remercie beaucoup pour la réponse. Mais ce n'est pas très clair pour moi. Si possible, pourriez-vous relier la réponse au code que j'ai fourni? Je suis errant quant à la façon dont je peux utiliser une propriété de chaîne avec un objet d'une collection pourrait être utilisé comme un paramètre de type; Je suis confus. Merci encore. –

+1

Le faire en fonction du type est meilleur IMO, mais si vous devez sélectionner en fonction d'une propriété, alors je suggère d'utiliser DataTemplateSelector http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a- datatemplateselector –

+0

Salut Elad, merci pour ça. Je vais essayer de mettre un commentaire. –

Questions connexes