无法在 ListView 中绑定分组 属性

Cannot Bind Grouping property in ListView

我有 ObservableCollection 个项目要用来对 ListView 进行分组,但我无法将分组绑定到该项目。

那是我的小class:

public class Module
{
    public string Name { get; set; }

    public Module(string name)
    {
        Name = name;
    }
}

视图模型:

public ObservableCollection<Module> ServerModules
{
    get => serverModules;
    set
    {
        if (serverModules == value) { return; }
        serverModules = value;
        OnPropertyChanged();
    }
}

这是我的Xaml代码:

<StackPanel Orientation="Vertical">
    <ListView ItemsSource="{Binding ServerModules}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Property" Width="200"/>
                <GridViewColumn Header="Value" Width="200"/>
            </GridView>
        </ListView.View>
        <ListView.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock FontSize="20" FontWeight="Bold" Foreground="DodgerBlue" Text="{Binding Name}"/>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </ListView.GroupStyle>
    </ListView>
</StackPanel>

无法解析Name属性。 我也尝试使用 CollectionViewSource 但它对我也不起作用:

<CollectionViewSource x:Key="GroupModules" Source="{Binding ServerModules}">
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="Name"/>
    </CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<ListView ItemsSource="{Binding Source={StaticResource GroupModules}}">

非常感谢任何想法和帮助。

更新解决方案:
在我的 Resources 部分,我定义了一个 CollectionViewSource 来设置一个 GroupDescription 属性 和一个 Style 来设置我的 GroupItem。

<UserControl.Resources>
    <CollectionViewSource x:Key="GroupedModules" Source="{Binding ServiceModuleSetViewModel.AllModuleProperties}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="ModuleName" />
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
    <!-- ListView GroupStyle.ContainerStyle -->
    <Style TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Expander IsExpanded="True">
                        <Expander.Header>
                            <TextBlock Text="{Binding Name}" FontSize="13" Foreground="DodgerBlue" FontWeight="Bold" />
                        </Expander.Header>
                        <ItemsPresenter />
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

列表视图:

    <ListView ItemsSource="{Binding Source={StaticResource GroupedModules}}">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.GroupStyle>
            <GroupStyle/>
        </ListView.GroupStyle>

        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" Width="200">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate DataType="local:ModuleProperty">
                            <TextBlock FontSize="13" Text="{Binding Path=Name}" TextAlignment="Center"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
                <GridViewColumn Header="Value" Width="200">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate DataType="local:ModuleProperty">
                            <TextBox FontSize="13" Text="{Binding Path=Value}" TextAlignment="Center"
                                     Width="100"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
    </ListView>

ListView 控件具有 CollectionViewSource 资源作为 ItemsSource
每个 GridViewColumn 都有一个 CellTemplate 用于在列中显示我的数据。

您需要为 GroupItem 定义样式或指定 GroupStyle.ContainerStyle
同样对于 GridViewColumn 你需要指定 DisplayMemberBinding.

<UserControl.Resources>
    <!-- ListView GroupStyle.ContainerStyle -->
    <Style TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Expander IsExpanded="True">
                        <Expander.Header>
                            <TextBlock Text="{Binding Name}" Foreground="Gray" FontWeight="Bold" />
                        </Expander.Header>
                        <ItemsPresenter />
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

<StackPanel Orientation="Vertical">
    <ListView ItemsSource="{Binding ServerModules}">
        <ListView.GroupStyle>
            <GroupStyle/>
        </ListView.GroupStyle>

        <ListView.View>
            <GridView>
                <GridViewColumn Header="Property" DisplayMemberBinding="{Binding Property}" Width="200"/>
                <GridViewColumn Header="Value" DisplayMemberBinding="{Binding Value}" Width="200"/>
            </GridView>
        </ListView.View>
    </ListView>
</StackPanel>