WPF - 从组标题样式中绑定到当前项目
Posted
技术标签:
【中文标题】WPF - 从组标题样式中绑定到当前项目【英文标题】:WPF - Binding to current item from within group header style 【发布时间】:2011-01-10 00:01:28 【问题描述】:我是一个 WPF 菜鸟,所以请放轻松 ;-)
我正在尝试创建一个分组的 DataGrid(WPF 工具包版本)。 我已经成功地创建了数据源、DataGrid 本身、所需的 CollectionViewSource 和组标题的样式(它使用扩展器)。
我想按名为“Assign_To”的属性进行分组,并在标题中显示相关值(分组项共享的值)。但是,我无法确定如何绑定到当前组/项目以返回其 Assign_To 属性。
我得到的最接近(如下所示)是绑定到整个 CollectionViewSource,它为 Assign_To 返回一个固定值。为了返回“Assign_To”的正确值,绑定到当前项目/组的正确方法是什么?
希望有人可以提供帮助。谢谢!
安迪·T。
这里是源...
<Window DataContext="Binding Source=StaticResource SampleDataSource"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="DataGridTest.MainWindow"
x:Name="Window"
Title="MainWindow"
Width="640" Height="480" mc:Ignorable="d">
<Window.Resources>
<CollectionViewSource x:Key="CVS" Source="Binding MyData">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Assign_To"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<Style x:Key="GroupHeaderStyle" TargetType="x:Type GroupItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type GroupItem">
<Expander IsExpanded="True">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Assign To: "/>
<TextBlock Text="Binding Source=StaticResource CVS, Path=Assign_To"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid x:Name="LayoutRoot">
<dg:DataGrid
ItemsSource="Binding Source=StaticResource CVS"
SelectionUnit="CellOrRowHeader"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserResizeRows="False">
<dg:DataGrid.GroupStyle>
<GroupStyle ContainerStyle="StaticResource GroupHeaderStyle">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<dg:DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</dg:DataGrid.GroupStyle>
</dg:DataGrid>
</Grid>
</Window>
【问题讨论】:
【参考方案1】:感谢您的回复。我真的很感激它,并会检查它是否有效。
无论如何,事实证明,经过一番戳戳和刺激,我只使用 XAML 解决了这个问题。我一直缺少的是组标题绑定到的每个项目都是 GroupItem 并且 GroupItem 的默认 DataContext 是 CollectionViewGroup强>。反过来,CollectionViewGroup 有一个 Items 属性,它是一个集合,因此我可以获得集合中第一个项目的 Assign_To 值并在我的标题文本中使用它。像这样:
<Style x:Key="GroupHeaderStyle" TargetType="x:Type GroupItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type GroupItem">
<Expander IsExpanded="True">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Assign To: "/>
<TextBlock Text="Binding Items[0].Assign_To"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
【讨论】:
【参考方案2】:绑定设置取决于 Assign_To 属性的类型。可能对您有用的最简单的设置是:
<TextBlock Text="Assign To: "/>
<TextBlock Text="Binding Name"/>
请检查以下示例是否适合您;这个链接WPF Toolkit DataGrid Part IV: TemplateColumns and Row Grouping也可能对你有帮助
代码:
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
var dataProvider = (CollectionViewSource)FindResource("CVS");
dataProvider.Source = Test.GetTests();
public class Test
public string Assign_To get; set;
public string Test0 get; set;
public int Test1 get; set;
public static List<Test> GetTests()
List<Test> tests = new List<Test>();
tests.Add(new Test Assign_To = "a", Test0 = "aaaa", Test1 = 1 );
tests.Add(new Test Assign_To = "a", Test0 = "bbbb", Test1 = 1 );
tests.Add(new Test Assign_To = "b", Test0 = "cccc", Test1 = 2 );
return tests;
xaml:
<Window.Resources>
<CollectionViewSource x:Key="CVS" >
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Assign_To"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<Style x:Key="GroupHeaderStyle" TargetType="x:Type GroupItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type GroupItem">
<Expander IsExpanded="True">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Assign To: "/>
<TextBlock Text="Binding Name"/>
</StackPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<DataGrid
ItemsSource="Binding Source=StaticResource CVS"
HorizontalScrollBarVisibility="Hidden" SelectionMode="Extended"
AutoGenerateColumns="False"
Name="dataGrid1">
<DataGrid.GroupStyle>
<GroupStyle ContainerStyle="StaticResource GroupHeaderStyle">
<GroupStyle.Panel>
<ItemsPanelTemplate>
<DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</DataGrid.GroupStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Test0" Binding="Binding Path=Test0" />
<DataGridTextColumn Header="Test1" Binding="Binding Path=Test1" />
</DataGrid.Columns>
</DataGrid>
</Grid>
【讨论】:
可以肯定的是,所有这一切都是在<TextBlock Text="Binding Name"/>
中显示当前分组依据,与集合中的基础项目无关
这是正确的,也可以正常工作。在source for CollectionViewSource
中可以看到Name
属性定义为“组的名称,即用于将数据项分组的属性的公共值。”以上是关于WPF - 从组标题样式中绑定到当前项目的主要内容,如果未能解决你的问题,请参考以下文章