2010-08-03 6 views
0

Je dois modifier le DataTemplate de ma ListBox, en fonction du nombre d'éléments ListBox. Je suis venu avec le XAML suivant:WPF: Modifiez dynamiquement ItemTemplate de ListBox en fonction des éléments ListBox Taille

<Window.Resources> 
    <DataTemplate x:Key="DefaultTemplate"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock Text="{Binding Path=Text}"/> 
    <TextBlock Text="default template" /> 
    </StackPanel> 
    </DataTemplate> 
    <DataTemplate x:Key="OtherTemplate"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBlock Text="{Binding Path=Text}"/> 
    <TextBlock Text="other template" /> 
    </StackPanel> 
    </DataTemplate>  
</Window.Resources> 
<ListBox Name="listBox1" ItemsSource="{Binding Path=Items}"> 
    <ListBox.Style> 
    <Style TargetType="{x:Type ListBox}"> 
     <Setter Property="ItemTemplate" Value="{StaticResource DefaultTemplate}" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=Items.Count}" Value="1"> 
      <Setter Property="ItemTemplate" Value="{StaticResource OtherTemplate}"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </ListBox.Style>  
</ListBox> 

Avec le XAML ci-dessus, une fois que j'ai ajouté deux ou plusieurs éléments à la liste liée, le modèle de données a changé comme prévu (d'autres par défaut). Cependant, si je supprime le premier élément de la liste avec plus de deux éléments, la boîte de liste entière devient vide (j'ai vérifié que la liste des liens n'est pas vide). Suppression du deuxième élément dans une liste de deux éléments fonctionne bien (c'est-à-dire que le modèle est passé de la valeur par défaut à l'autre).

Des idées pour lesquelles cela se passe? Ou peut-être que je suis allé dans le mauvais sens pour résoudre ce problème?

Répondre

2

vous pouvez utiliser des déclencheurs de données, ou vous pouvez utiliser un DataTemplateSelectorHere est un article qui montre les bases. et here est le MSDN sur l'appliquer au contrôle des articles (également, une zone de liste)

2

Je ne peux pas parler pour le problème exact ou la cause, mais c'est parce qu'un DataTrigger est en train de définir un modèle lorsque le nombre est 1 et seulement 1.

Vous pouvez faire 1 des 3 choses à résoudre ce problème, mais seulement 1 je recommanderais.

a) Mettre en oeuvre votre propre DataTrigger en dérivant de System.Windows.TriggerBase

b) Utiliser une implémentation de System.Windows.Data.IValueConverter qui convertira de ItemsControl.Items.Count en DataTemplate. Récupérez les modèles en plaçant un élément dans la portée de vos ressources en tant que Binding.ConverterParameter, en les convertissant en FrameWorkElement et en appelant FrameWorkElement.FindResource().

C) Ceci est ma recommandation, écrivez le vôtre DataTemplateSelector pour faire le travail de grognement. Ce mécanisme est spécifiquement ciblé sur la fonctionnalité que vous avez avec vous. J'ai récemment écrit un qui choisira un DataTemplate basé sur le type de l'objet source sans nécessiter un DataTemplate sans x: Key set. À l'aide de propriétés sur le sélecteur de modèle, vous pouvez transmettre des DataTemplates dans DataTemplateSelector en utilisant XAML, en supprimant cette liste de codes FindResource 'todo'.