сортировка связанного ItemsControl в DataTemplate (только XAML)

существует ли единственный способ XAML автоматически сортировать связанные элементы (список объектов ViewModel) ItemsControl на основе одного из свойств элементов. ItemsControl является частью DataTemplate. Я думал, что CollectionViewSource сделает трюк, но как привязать CollectionViewSource к ItemsControl. Следующий код ничего не dispays:

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

2 ответов


попробуйте переместить CollectionViewSource ресурс в область Viewbox, а не непосредственно 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>

Я не использовал DataTemplate или ViewBox для этого. Порядок сортировки можно выбрать, указав ItemsControl.Ресурс....

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

удачи!