【问题标题】:WPF - Binding to current item from within group header styleWPF - 从组标题样式中绑定到当前项目
【发布时间】: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>

【问题讨论】:

    标签: wpf xaml datagrid binding grouping


    【解决方案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>
      

      【讨论】:

      • 可以肯定的是,所有这一切都是在&lt;TextBlock Text="{Binding Name}"/&gt; 中显示当前分组依据,与集合中的基础项目无关
      • 这是正确的,也可以正常工作。在source for CollectionViewSource 中可以看到Name 属性定义为“组的名称,即用于将数据项分组的属性的公共值。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多