【问题标题】:WPF How to set DataGrid.Group header text when it's actually collapsedWPF如何在实际折叠时设置DataGrid.Group标题文本
【发布时间】:2017-02-06 02:22:21
【问题描述】:

我正在使用 WPF 应用程序,我使用 <DataGrid.GroupStyle> 对我的项目进行分组,我想知道如何在组折叠时设置标题文本。我正在将订单加载到该分组网格中,当我折叠特定组时,我希望看到类似 Order : number of order 的内容,因为方向更容易。现在我只看到订单数量,但我怎么能添加文本到:

<DockPanel>
   <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" /> //+ some text
</DockPanel>

(另外,在我添加&lt;DataGrid.Columns&gt; 之后,因为我想手动添加我的列,屏幕上突然出现垂直滑块,即使左边或右边没有更多的项目,而且看起来很糟糕而且很烦人,我怎么能删除那个滑块,我想保留我的数据网格列,因为我想根据需要设置它们的样式,但我不想看到那个滑块:/?)

这是我的代码:

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="10*" />
</Grid.ColumnDefinitions>

<DataGrid Grid.Column="0" RowHeaderWidth="0" CanUserAddRows="False" AutoGenerateColumns="False"  x:Name="datagrid1" Margin="10,150,8,50" Background="Transparent" VerticalContentAlignment="Center" HorizontalContentAlignment="Center" ItemsSource="{Binding}">

  <DataGrid.Resources>
    <Style TargetType="{x:Type DataGridColumnHeader}">
      <Setter Property="Background" Value="Black"/>
      <Setter Property="Opacity" Value="0.5"/>
      <Setter Property="Foreground" Value="White"/>
      <Setter Property="HorizontalContentAlignment" Value="Center" />
      <Setter Property="FontSize" Value="15"/>
      <Setter Property="FontFamily" Value="Arial"/>
      <Setter Property="Height" Value="50"/>
    </Style>
  </DataGrid.Resources>

  <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding ProductName}"      Header="Title"      MinWidth="50"   FontSize="16"  FontFamily="Verdana" />
    <DataGridTextColumn Binding="{Binding Quantity}"       Header="Quantity"    MinWidth="30"   FontSize="16"  FontFamily="Verdana" />
    <DataGridTextColumn Binding="{Binding NumberOfOrder}"    Header="Order number"  MinWidth="30"   FontSize="16"  FontFamily="Verdana" />
    <DataGridTextColumn Binding="{Binding User}"          Header="User"         Width="*"     FontSize="16"   FontFamily="Verdana" />
  </DataGrid.Columns>

  <DataGrid.GroupStyle>
    <!-- Style for groups at top level. -->
    <GroupStyle>
      <GroupStyle.ContainerStyle>
        <Style TargetType="{x:Type GroupItem}">
          <Setter Property="Template">
            <Setter.Value>
              <ControlTemplate TargetType="{x:Type GroupItem}">
                <Expander IsExpanded="True">
                  <Expander.Header>
                    <DockPanel>
                      <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" /> //I am wondering what does this line mean?
                    </DockPanel>
                  </Expander.Header>
                  <Expander.Content>
                    <ItemsPresenter />
                  </Expander.Content>
                </Expander>
              </ControlTemplate>
            </Setter.Value>
          </Setter>
        </Style>
      </GroupStyle.ContainerStyle>
    </GroupStyle>
  </DataGrid.GroupStyle>
</DataGrid>

P.S 垂直滑块@我的数据网格底部的屏幕截图

【问题讨论】:

  • Text="{Binding Path=Name,StringFormat= Order : {0}}" 看起来这是第一个问题的解决方案,滑块向左,太烦人了

标签: c# wpf datagrid rows


【解决方案1】:

我们需要一个Trigger 如下所示,以及一个IValueConverter 来查找组中的项目数:

<Expander.Style>
    <Style TargetType="Expander">
        <Style.Triggers>
            <Trigger Property="IsExpanded" Value="True">
                <Setter Property="Header">
                    <Setter.Value>
                        <DockPanel>
                            <TextBlock FontWeight="Bold" Text="{Binding Name}" />
                        </DockPanel>
                    </Setter.Value>
                </Setter>
            </Trigger>
            <Trigger Property="IsExpanded" Value="False">
                <Setter Property="Header">
                    <Setter.Value>
                        <DockPanel>
                            <TextBlock FontWeight="Bold">
                              <TextBlock.Inlines>
                                 <Run Text="{Binding Name}"/>
                                 <Run Text=" ( "/>
                                   <Run Text="{Binding Name, Converter={StaticResource ItemCountCnvKey}}" />
                                 <Run Text=" ) "/>
                              </TextBlock.Inlines>
                            </TextBlock>
                        </DockPanel>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</Expander.Style>

ItemCountConverter

public class ItemCountConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        CollectionViewGroup group = (CollectionViewGroup)value;            
        ReadOnlyObservableCollection<object> items = group.Items;
        return items.Count;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

【讨论】:

  • 就是这样,你认为为什么当我添加 时水平滑块出现在数据网格的底部?
  • 你有什么发现吗?
  • @Roxy'Pro 分组后还会出现吗?
  • 实际上是在我添加分组后出现的,现在有两种情况,当我删除我的&lt;DataGrid.Columns&gt;定义并将其设置为Autogenerate=true时,它会消失,或者当我删除DataGrid.Group它时也会消失,但我想保留我的&lt;DataGrid.Columns&gt; 定义和分组,我只想摆脱那个水平滑块,因为他没有任何功能
  • @Roxy'Pro 将最后一列的宽度从 * 更改为 200 即可解决问题。
猜你喜欢
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 2017-08-30
  • 1970-01-01
相关资源
最近更新 更多