wpf - 使用它从 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。
解决方案
您是否有理由需要将 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>
推荐阅读
- c - 增加同一个全局变量时线程的行为如何?
- opengl - 编译 OpenGL 4 Shading Language Cookbook,第 3 版的示例时出错
- python - 如何在列表列表中对元组的第二个元素求和?
- excel - 获取 id2 的值
- python - 仅当在 try/except 子句范围内时 NoneType 不可下标错误
- r - 如何制作绘图以比较 rpkm 值
- php - PHP中的会话变量没有出现
- automation - 对命令“gcloud compute instance-templates delete”自动回答是
- python - 如何从一个 csv 文件中读取多个矩阵?
- javascript - 获取 ENOENT:没有这样的文件或目录,打开...尝试将 App.js/index.js 文件移动到 /src 文件夹中的子文件夹时出错