首页 > 解决方案 > 使用它从 ListView 收集源不同的 DataContext

问题描述

对于使用 StackPanel 作为其 ItemsPanelTemplate 的 ListView,我有以下 DataTemplate。

<DataTemplate x:Key="DayTemplate">
    <Border BorderBrush="Black"
            BorderThickness="2"
            CornerRadius="5"
            Width="150"
            Height="440"
            Background="White">
        <StackPanel Orientation="Vertical">
            <Border BorderBrush="Black"
                    BorderThickness="0 0 0 5"
                    Background="White">
                <StackPanel>
                    <StackPanel.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="Add Session"
                                      Command="{x:Static cmd:TimetableCommands.AddSession}"/>
                        </ContextMenu>
                    </StackPanel.ContextMenu>
                    <TextBlock FontWeight="Bold"
                               TextAlignment="Center"
                               Text="{Binding Path=DateInfo.Date, Mode=OneWay, Converter={StaticResource DateNoTime}}"/>
                    <TextBlock TextAlignment="Center"
                           FontWeight="Bold"
                           Text="{Binding Path=DateInfo.DayOfWeek}"/>
                </StackPanel>
            </Border>
            <ListBox Name="lbSessions"
                     Background="Transparent"
                     HorizontalAlignment="Center"
                     Visibility="Visible"
                     ItemsSource="{Binding Source={StaticResource SessionList}}"
                     ItemTemplate="{StaticResource SessionTemplate}">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
            </ListBox>
        </StackPanel>
    </Border>
</DataTemplate>

我还有以下收集源,我想将其用于排序功能。它位于单独的资源库中,在定义 DataTemplate 的资源库中正确引用。

<CollectionViewSource Source="{Binding Path=Sessions, Mode=OneWay}"
                      x:Key="SessionList">
    <CollectionViewSource.SortDescriptions>
         <scm:SortDescription PropertyName="StartTime"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

运行时,不显示任何数据,并且输出窗口指示收集源正在尝试从窗口级别 DataContext 获取项目列表的数据,而不是列表使用的 DataContext(这是从窗口视图模型)。

如果我换行

ItemsSource="{Binding Source={StaticResource SessionList}}" 

ItemsSource="{Binding Path=Sessions}"

它工作得很好,虽然我不再拥有 Collection Source 的排序功能,我真的想利用它来避免编写我自己的排序代码。

这是怎么回事?以及如何在 Collection Source 上设置正确的 DataContext。

标签: wpfdata-bindingcollections

解决方案


您是否有理由需要将 CollectionViewSource 保存在单独的 ResourceDictionary 中?

尝试将 CollectionViewSource 嵌套在 ListBox 的项目中

<ListBox Name="lbSessions"
         Background="Transparent"
         HorizontalAlignment="Center"
         Visibility="Visible"
         ItemTemplate="{StaticResource SessionTemplate}">
  <ListBox.Items>
    <CollectionViewSource Source="{Binding Path=Sessions, Mode=OneWay}">
      <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="StartTime" />
      </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
  </ListBox.Items>
</ListBox>

推荐阅读