WPF DataGrid.GroupStyle 与 MVVM

标签 wpf mvvm wpfdatagrid

我尝试列出几个应该在三个不同组中可视化的数据项:

  • 仪表板
  • 家政
  • 科学

  • 使用 MVVM (Model-View-ViewModel) 设计模式,我制作了两个模型类:

    数据组.cs
    public class DataGroup
    {
        public String Name { get; set; }
    }
    

    数据项.cs
    public class DataItem
    {
        public String Name { get; set; }
        public String Format { get; set; }
        public DataGroup Group { get; set; }
    }
    

    ...一个 ViewModel 类:
    DataListViewModel.cs
    class DataListViewModel : ViewModelBase
    {
        public List<Models.DataGroup> GroupList { get; set; }
        public List<Models.DataItem> DataList { get; set; }
    
        public DataListViewModel()
        {
            var GroupList = new List<Models.DataGroup>
            {
                new Models.DataGroup
                {
                    Name = "Dashboard"
                },
                new Models.DataGroup
                {
                    Name = "Housekeeping"
                },
                new Models.DataGroup
                {
                    Name = "Science"
                }
            };
    
            var DataList = new List<Models.DataItem>
            {
                new Models.DataItem
                {
                    Name = "Panel A",
                    Format = "N/A",
                    Group = GroupList[0],
                },
                new Models.DataItem
                {
                    Name = "Panel B",
                    Format = "N/A",
                    Group = GroupList[0],
                },
                new Models.DataItem
                {
                    Name = "Panel C",
                    Format = "N/A",
                    Group = GroupList[0],
                },
                new Models.DataItem
                {
                    Name = "+3.4 V",
                    Format = "TBD",
                    Group = GroupList[1],
                },
                new Models.DataItem
                {
                    Name = "+5.3 V",
                    Format = "TBD",
                    Group = GroupList[1],
    
    etc.
    这里是 XAML 代码 数据列表.xaml
    <ListView Name="PersonListView"
                          ItemsSource="{Binding DataList}"
                          IsSynchronizedWithCurrentItem="True"
                          SelectedItem="{Binding SelectedDataItem}">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
                </GridView>
            </ListView.View>
        </ListView>
    
        <!-- DataList -->
        <DataGrid BorderBrush="Black"
                  ItemsSource="{Binding DataList}"
                  SelectedItem="{Binding SelectedDataItem}"
                  IsSynchronizedWithCurrentItem="True"
                  AutoGenerateColumns="False"
                  IsReadOnly="True" SelectionMode="Single">
            <DataGrid.Style>
                <Style TargetType="DataGrid" BasedOn="{StaticResource {x:Type DataGrid}}">
                    <Setter Property="AlternatingRowBackground" Value="{DynamicResource AccentColorBrush4}"/>
                </Style>
            </DataGrid.Style>
    
            <!--GroupStyle to group data-->
            <DataGrid.GroupStyle>
                <GroupStyle>
    
                    <GroupStyle.HeaderTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding GroupList, IsAsync=True}"/>
                            </StackPanel>
                        </DataTemplate>
                    </GroupStyle.HeaderTemplate>
    
                    <!--Group DataItems into DataGroup-->
                    <GroupStyle.ContainerStyle>
                        <Style TargetType="{x:Type GroupItem}">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type GroupItem}">
                                        <Expander IsExpanded="True" Background="{StaticResource HighlightBrush}">
                                            <Expander.Header >
                                                <StackPanel Orientation="Horizontal">
                                                    <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Foreground="{DynamicResource WhiteBrush}"/>
                                                    <TextBlock Text=" - " Foreground="{DynamicResource WhiteBrush}"/>
                                                    <TextBlock Text="{Binding Path=ItemCount}" Foreground="{DynamicResource WhiteBrush}"/>
                                                </StackPanel>
                                            </Expander.Header>
                                            <ItemsPresenter/>
                                        </Expander>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </GroupStyle.ContainerStyle>
    
                </GroupStyle>
            </DataGrid.GroupStyle>
    
    
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Format" Binding="{Binding Format}" ElementStyle="{StaticResource DataGridTextColumnRightAlignStyle}"/>
                <!--<DataGridTextColumn Header="SID" Binding="{Binding Sid}" ElementStyle="{StaticResource DataGridTextColumnRightAlignStyle}"/>-->
    
            </DataGrid.Columns>
        </DataGrid>
    

    我能够可视化 DataList,但对它们进行组合不起作用。如何更改 DataListViewModel 中的代码?

    最佳答案

    要对这样的列表进行分组,您需要使用 CollectionViewSource。

    将其添加到您的资源中,如下所示:

        <CollectionViewSource x:Key="GroupedDataList" Source="{Binding DataList}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="Group" />
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    

    并绑定(bind)到它而不是直接绑定(bind)到 DataList :
        <DataGrid BorderBrush="Black"
              ItemsSource="{Binding Source={StaticResource GroupedDataList}}"
    
    GroupStyle显示也有点偏离 - 你不需要 HeaderTemplate那里有ContainerStyle你已经申请了。此外,您需要更改 Binding第一个 TextBlockName.Name :
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Path=Name.Name}" FontWeight="Bold" Foreground="{DynamicResource WhiteBrush}"/>
        <TextBlock Text=" - " Foreground="{DynamicResource WhiteBrush}"/>
        <TextBlock Text="{Binding Path=ItemCount}" Foreground="{DynamicResource WhiteBrush}"/>
    </StackPanel>
    

    但是你可以玩弄绑定(bind)和放置,找出最适合你的。

    哦,我做的最后一件事是删除顶部的 ListView,它在我制作的示例应用程序中完全被掩盖了。但是,根据您包含的 XAML,可能并非如此。

    希望这可以帮助!

    关于WPF DataGrid.GroupStyle 与 MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32949319/

    相关文章:

    c# - 如何获取绑定(bind)到可观察集合的数据网格以使用 mvvm 通知删除?

    WPF - DataGrid 列标题对齐

    WPF DataGrid 取消选择更改

    wpf - Visualstudio 如何知道当前项目的类型?

    c# - WPF MVVM : Binding to property of object

    c# - 作为可重用 XAML 片段的矢量图像

    wpf - 将鼠标悬停在 WPF 中包含斜杠的单元格上时向工具提示添加文本

    c# - WPF 更改具有附加属性的控件的背景

    c# - 显示名称为 'System.Windows.Interactivity'的程序集无法加载

    c# - 我对 MVVM 模式有一些疑问