8

¿Existe una forma única de XAML para ordenar automáticamente los elementos encuadernados (lista de objetos de ViewModel) ItemsControl según una de las propiedades de los elementos? ItemsControl es parte de un DataTemplate. Pensé que CollectionViewSource haría el truco, pero ¿cómo puedo unir CollectionViewSource a ItemsControl? El código dispays follwoing nada:ordenando un ItemsControl encuadernado en una plantilla de datos (solo XAML)

<--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

¿Algo relacionado con "Employess" se escribe mal? De lo contrario, se ve bien para mí. – Crispy

+0

No, no es que el problema aquí parece ser (tal vez) que el enlace de ViewModel ({x: Type vm: Company}) no se conoce o no se evalúa dentro del alcance del recurso. Los empleados son propiedad de la Compañía por cierto. – bitbonk

Respuesta

20

Intente mover el recurso CollectionViewSource al alcance de la Viewbox en lugar de directamente al 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

Como una extensión de la respuesta, el motivo se debe a que solo el elemento raíz de un DataTemplate tiene su conjunto DataContext. El DataTemplate en sí mismo no. Como DataContext es la única forma de enlazar al objeto con plantilla, debe poner el recurso en el alcance de un DataContext que no sea nulo. – Gusdor

5

Yo no utilizar un DataTemplate o ViewBox para hacer esto. Se puede elegir el orden de clasificación especificando una 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> 

Buena suerte!

Cuestiones relacionadas