无法在 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 分组