为什么组在 C# wpf datagrid 中不显示?

问题描述 投票:0回答:1

我正在将数据加载到 C# wpf 数据网格,并尝试在其中显示组。 我正在关注这篇文章:https://learn.microsoft.com/en-us/dotnet/desktop/wpf/controls/how-to-group-sort-and-filter-data-in-the-datagrid-control ?视图=netframeworkdesktop-4.8 我还找到了这篇文章:https://www.c-sharpcorner.com/uploadfile/dpatra/grouping-in-datagrid-in-wpf/但我更喜欢 Microsoft 指南中解释的方法。

这是我的xaml代码:

 <UserControl.Resources>
     <local:MachineTools x:Key="machinetools" />
     <CollectionViewSource x:Key="cvsMachineTools" Source="{StaticResource machinetools}" IsLiveGroupingRequested="True">
         <CollectionViewSource.GroupDescriptions>
             <PropertyGroupDescription PropertyName="Kinematic"/>
         </CollectionViewSource.GroupDescriptions>
     </CollectionViewSource>
 </UserControl.Resources>

<DataGrid Name="lvTools" Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="1" AutoGenerateColumns="False" IsReadOnly="True" ItemsSource="{Binding Source={StaticResource cvsMachineTools}}">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="Kinematic" Binding="{Binding Path=Kinematic}" Header="Kinematic"></DataGridTextColumn>
        <DataGridTextColumn x:Name="olvColumn1ToolName" Binding="{Binding Path=Name}" Header="Name"></DataGridTextColumn>
        <DataGridTextColumn x:Name="olvDiameter" Binding="{Binding Path=Diameter}" Header="D"></DataGridTextColumn>
        <DataGridTextColumn x:Name="olvColumnDMin" Binding="{Binding Path=DiameterMin}" Header="DMin"></DataGridTextColumn>
        <DataGridTextColumn x:Name="olvDiameterMax" Binding="{Binding Path=DiameterMax}" Header="DMax"></DataGridTextColumn>
        <DataGridTextColumn x:Name="olvColumn6Angle" Binding="{Binding Path=Angle}" Header="Angle"></DataGridTextColumn>
        <DataGridTextColumn x:Name="olvCuttingLength" Binding="{Binding Path=CutLenght}" Header="CutLength"></DataGridTextColumn>
        <DataGridTextColumn x:Name="olvFreeLength" Binding="{Binding Path=FreeLength}" Header="FreeLength"></DataGridTextColumn>
        <DataGridTextColumn x:Name="olvColumn11ToolType" Binding="{Binding Path=ToolType}" Header="Type"></DataGridTextColumn>
        <DataGridTextColumn x:Name="olvX" Header="X" Binding="{Binding Path=OffSetX}"></DataGridTextColumn>
        <DataGridTextColumn x:Name="olvY" Header="Y" Binding="{Binding Path=OffSetY}"></DataGridTextColumn>
        <DataGridTextColumn x:Name="olvZ" Header="Z" Binding="{Binding Path=OffSetZ}"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

这是 C# 代码:

MachineTools _tools = (MachineTools)this.Resources["machinetools"];
LoadMachineTools(ref _tools);

    public class MachineTools : ObservableCollection<Tool3D>
    {
        // Creating the collection in this way enables data binding from XAML.
    }

Tool3D是个大类,这里就不贴了,它实现了INotifyPropertyChanged。

我想对运动学列进行分组,该列是整数

数据已加载并显示在表格中,但组未显示。

为了调试目的,我检查了

this.lvTools.ItemsSource.Groups
,它有三个与预期一样的组,但是 - 它们没有显示在界面中。

为什么会发生这种情况?如何显示群组?

c# wpf xaml datagrid
1个回答
0
投票

好吧,我已经解决了这个问题。我使用了这些文章:

我完全删除了

 <UserControl.Resources>
部分和
DataGrid
的 xaml 绑定。然后,在 rani-irsan 文章之后,我在代码中声明了绑定:

        public CollectionViewSource _itemSourceList = new CollectionViewSource();
        public ICollectionView Itemlist = null;
        public MachineTools _tools = new MachineTools();

            _itemSourceList.Source = _tools;
            Itemlist = _itemSourceList.View;
            Itemlist.GroupDescriptions.Clear();
            Itemlist.GroupDescriptions.Add(new PropertyGroupDescription("Kinematic"));
            Itemlist = _itemSourceList.View;
            lvTools.ItemsSource = Itemlist;

我还在我的数据网格标签中添加了此样式声明:

<DataGrid.GroupStyle>
    <GroupStyle>
        <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type GroupItem}">
                            <StackPanel>
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding Name}" />
                                    <TextBlock Text="{Binding ItemCount, StringFormat=Count: {0}}" 
                          Margin="30,0,0,0" />
                                </StackPanel>
                                <ItemsPresenter />
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </GroupStyle.ContainerStyle>
    </GroupStyle>
</DataGrid.GroupStyle>

CanUserAddRows="False" 
也可能有帮助,也许但不确定

之后,我可以在表格中获得看起来非常简单的组标题。我认为

DataGrid.GroupStyle
是最有帮助的

© www.soinside.com 2019 - 2024. All rights reserved.