8

Existe-t-il un seul moyen XAML de trier automatiquement les éléments liés (liste d'objets ViewModel) ItemsControl en fonction de l'une des propriétés des éléments. Le ItemsControl fait partie d'un DataTemplate. Je pensais que CollectionViewSource ferait l'affaire, mais comment lier le CollectionViewSource à ItemsControl. Le code follwoing dispays rien:Trier un ItemsControl lié dans un DataTemplate (XAML uniquement)

<--xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"--> 
    <DataTemplate DataType="{x:Type vm:Company}"> 
     <DataTemplate.Resources> 
      <CollectionViewSource x:Key="viewSource" Source="{Binding Employees}"> 
       <CollectionViewSource.SortDescriptions> 
         <scm:SortDescription PropertyName="ID" /> 
        </CollectionViewSource.SortDescriptions> 
      </CollectionViewSource> 
     </DataTemplate.Resources> 
     <Viewbox> 
      <ItemsControl ItemsSource="{Binding Source={StaticResource viewSource}}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Horizontal"/> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
      </ItemsControl> 
     </Viewbox> 
    </DataTemplate> 
+0

Tout ce qui a trait à "Employess" est-il mal orthographié? Sinon, ça me va. – Crispy

+0

Non, ce n'est pas que le problème ici semble être (peut-être) que la liaison ViewModel ({x: Type vm: Company}) ne soit pas connue ou non évaluée dans la portée de la ressource. Les employés sont une propriété de Company btw. – bitbonk

Répondre

20

Essayez de déplacer la ressource CollectionViewSource à la portée de la Viewbox plutôt que directement le DataTemplate:

<DataTemplate DataType="{x:Type vm:Company}"> 
    <Viewbox> 
     <Viewbox.Resources> 
      <CollectionViewSource x:Key="viewSource" Source="{Binding Employees}"> 
       <CollectionViewSource.SortDescriptions> 
         <scm:SortDescription PropertyName="ID" /> 
        </CollectionViewSource.SortDescriptions> 
      </CollectionViewSource> 
     </Viewbox.Resources> 
     <ItemsControl ItemsSource="{Binding Source={StaticResource viewSource}}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal"/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </Viewbox> 
</DataTemplate> 
+3

En tant qu'extension de la réponse, la raison en est que seul l'élément racine d'un DataTemplate a son ensemble DataContext. Le DataTemplate lui-même ne le fait pas. Comme DataContext est le seul moyen de se lier à l'objet modélisé, vous devez placer la ressource dans la portée d'un DataContext non Null. – Gusdor

5

Je ne pas utiliser un DataTemplate ou ViewBox pour le faire. Vous pouvez choisir l'ordre de tri en spécifiant une ItemsControl.Resource ....

<ItemsControl xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
     x:Name="MyItemsControl" Loaded="MyItemsControl_Loaded"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <ItemsControl> 
     <ItemsControl.Resources> 
      <CollectionViewSource x:Key="Orders" Source="{Binding Orders}"> 
      <CollectionViewSource.SortDescriptions> 
       <scm:SortDescription PropertyName="OrderID" Direction="Ascending"/> 
      </CollectionViewSource.SortDescriptions> 
      </CollectionViewSource> 
     </ItemsControl.Resources> 
     <ItemsControl.ItemsSource> 
      <Binding Source="{StaticResource Orders}"/> 
     </ItemsControl.ItemsSource> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
      <TextBlock Text="{Binding OrderID}"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Bonne chance!

Questions connexes