2009-06-29 6 views
2

J'ai ce simple exemple XAML:sélection de modèle à base de données en WPF

<Window x:Class="DynTemplateTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 

    <Window.Resources> 
     <DataTemplate x:Key="ItemTemplate"> 
      <ItemsControl ItemsSource="{Binding}"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <Rectangle Width="30" Height="30" Fill="Red"></Rectangle>       
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <Canvas /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemContainerStyle> 
        <Style> 
         <Setter Property="Canvas.Left" Value="{Binding Position}"></Setter> 
        </Style> 
       </ItemsControl.ItemContainerStyle> 
      </ItemsControl> 
     </DataTemplate> 
    </Window.Resources> 

    <DockPanel LastChildFill="True"> 
     <ContentPresenter 
      Content="{Binding Path=Items}" 
      ContentTemplate="{StaticResource ItemTemplate}" 
      > 
     </ContentPresenter> 
    </DockPanel> 

</Window> 

Il est rendu mes articles dans la collection observable dans le style MVVM. Chaque élément a sa position horizontale dans une propriété. Chaque élément a également une propriété IsSpecial qui indique si elle veut être rendue d'une manière spéciale. Je veux que les éléments ordinaires (IsSpecial = false) soient représentés par des carrés rouges (déjà dans le code) et des éléments spéciaux par des cercles bleus avec du texte "spécial" à l'intérieur.

Ce que je ne sais pas, c'est comment ajuster le code XAML pour faire la sélection de modèle pour les articles. Y at-il un moyen de le faire sans coder mon propre ItemTemplateSelector? Cela fonctionnera-t-il toujours avec le positionnement de la toile basé sur la liaison. Je pense que la solution consiste à extraire le modèle d'élément dans un modèle séparé, créer un modèle supplémentaire pour les éléments spéciaux et ensuite jouer avec des déclencheurs ... mais ce n'est pas très facile pour moi car je suis un débutant WPF pour le moment.

L'autre chose est que je n'aime pas du tout la façon dont la Position est passée aux objets. Y a-t-il un autre moyen?

Existe-t-il d'autres recommandations pour améliorer le code?

Répondre

5

Je l'ai résolu moi-même: D

<Window x:Class="DynTemplateTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 

    <Window.Resources> 
     <DataTemplate x:Key="NormalItem"> 
      <Rectangle Width="30" Height="30" Fill="Red"></Rectangle>       
     </DataTemplate> 
     <DataTemplate x:Key="SpecialItem"> 
      <Rectangle Width="30" Height="30" Fill="Red"></Rectangle>       
     </DataTemplate> 
     <DataTemplate x:Key="ItemTemplate"> 
      <ItemsControl ItemsSource="{Binding}"> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <ContentControl Content="{Binding}" ContentTemplate="{StaticResource NormalItem}" x:Name="ItemsContentControl" /> 
         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding Path=IsSpecial}" Value="true"> 
           <Setter TargetName="ItemsContentControl" Property="ContentTemplate" Value="{StaticResource SpecialItem}" /> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <Canvas /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemContainerStyle> 
        <Style> 
         <Setter Property="Canvas.Left" Value="{Binding Position}" /> 
        </Style> 
       </ItemsControl.ItemContainerStyle> 
      </ItemsControl> 
     </DataTemplate> 
    </Window.Resources> 

    <DockPanel LastChildFill="True"> 
     <ContentPresenter 
      Content="{Binding Path=Items}" 
      ContentTemplate="{StaticResource ItemTemplate}" 
      > 
     </ContentPresenter> 
    </DockPanel> 

</Window> 

Mais encore, des réflexions sur des solutions de rechange ou des améliorations?

Questions connexes