我正在将数据加载到 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
,它有三个与预期一样的组,但是 - 它们没有显示在界面中。
为什么会发生这种情况?如何显示群组?
好吧,我已经解决了这个问题。我使用了这些文章:
我完全删除了
<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
是最有帮助的