无法在 ListView 中绑定分组属性

Posted

技术标签:

【中文标题】无法在 ListView 中绑定分组属性【英文标题】:Cannot Bind Grouping property in ListView 【发布时间】:2021-03-31 15:40:49 【问题描述】:

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

这是我的小班:

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 来在列中显示我的数据。

【问题讨论】:

这能回答你的问题吗? How do I use WPF bindings with RelativeSource? 感谢您的回复。我不确定 - 我尝试了一些方法,但仍然没有得到正确的结果(请参阅帖子中的更新)。也许你可以提供一些代码示例。 好吧,我的第一条评论可能让你误入歧途。我认为本教程很好地概述了如何使用 ListView 分组:The ListView control: ListView grouping 那篇文章绝对帮助了我,开发了一个解决方案。对我个人而言,仍然很难将网站上的代码隐藏示例改编为 MVVM 架构,但最终我有了一个可行的解决方案。我会尽快分享。 【参考方案1】:

您需要为 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>

【讨论】:

感谢您的代码示例。对我来说这还不够,我还需要在 Resources 部分定义一个CollectionViewSource 以便能够使用GroupDescription 属性。我将在上面分享我的工作解决方案。

以上是关于无法在 ListView 中绑定分组属性的主要内容,如果未能解决你的问题,请参考以下文章

子列表未绑定到 xamarin 表单中的 ListView 分组

如何绑定listView中项的子属性?

winform。 listview 更新数据后刷新

无法聚焦 ListView

winform c# listview 如何 选中行!急!在线等!

winform c# listview 如何 选中行!急!在线等!