本文介绍了使用分组绑定 WPF 中的列表框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 ViewModel 集合,并希望将 ListBox 绑定到它们.做了一些调查,我发现 this.

I've got a collection of ViewModels and want to bind a ListBox to them. Doing some investigation I found this.

所以我的 ViewModel 看起来像这样(伪代码)

So my ViewModel look like this (Pseudo Code)

interface IItemViewModel
{
 string DisplayName { get; }
}

class AViewModel : IItemViewModel
{
 string DisplayName { return "foo"; }
}

class BViewModel : IItemViewModel
{
 string DisplayName { return "foo"; }
}

class ParentViewModel
{
 IEnumerable<IItemViewModel> Items
 {
  get
  {
   return new IItemViewModel[] {
    new AItemViewModel(),
    new BItemViewModel()
   }
  }
 }
}

class GroupViewModel
{
 static readonly GroupViewModel GroupA = new GroupViewModel(0);
 static readonly GroupViewModel GroupB = new GroupViewModel(1);

 int GroupIndex;
 GroupViewModel(int groupIndex)
 {
  this.GroupIndex = groupIndex;
 }

 string DisplayName
 {
  get { return "This is group " + GroupIndex.ToString(); }
 }
}

class ItemGroupTypeConverter : IValueConverter
{
 object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 {
  if (value is AItemViewModel)
   return GroupViewModel.GroupA;
  else
   return GroupViewModel.GroupB;
 }
}

还有这个 XAML

<UserControl.Resources>
 <vm:ItemsGroupTypeConverter x:Key="ItemsGroupTypeConverter "/>
 <CollectionViewSource x:Key="GroupedItems" Source="{Binding Items}">
  <CollectionViewSource.GroupDescriptions>
   <PropertyGroupDescription Converter="{StaticResource ItemsGroupTypeConverter }"/>
  </CollectionViewSource.GroupDescriptions>
 </CollectionViewSource>
</UserControl.Resources>
<ListBox ItemsSource="{Binding Source={StaticResource GroupedItems}}">
 <ListBox.GroupStyle>
  <GroupStyle>
   <GroupStyle.HeaderTemplate>
    <DataTemplate>
     <TextBlock Text="{Binding DisplayName}" FontWeight="bold" />
    </DataTemplate>
   </GroupStyle.HeaderTemplate>
  </GroupStyle>
 </ListBox.GroupStyle>
 <ListBox.ItemTemplate>
  <DataTemplate>
   <TextBlock Text="{Binding DisplayName}" />
  </DataTemplate>
 </ListBox.ItemTemplate>
</ListBox>

除了 HeaderTemplate 的绑定不起作用之外,这以某种方式起作用.无论如何,我宁愿省略 TypeConverter 和 CollectionViewSource.没有办法使用 ViewModel 的属性进行分组吗?

This works somehow, exept of the fact that the binding of the HeaderTemplate does not work. Anyhow I'd prefer omitting the TypeConverter and the CollectionViewSource. Isn't there a way to use a property of the ViewModel for Grouping?

我知道在这个示例场景中,很容易将 GroupViewModel 替换为字符串并使其正常工作,但这不是一个选项.那么如何将 HeaderTemplate 绑定到 GroupViewModel?

I know that in this sample scenario it would be easy to replace the GroupViewModel with a string an have it working, but that's not an option. So how can I bind the HeaderTemplate to the GroupViewModel?

推荐答案

好吧,我终于自己解决了.

Ok, I finally solved it myself.

首先,TypeConverter 是不必要的,因为 PropertyGroupDescription 可以绑定在 PropertyName 上.所以我向 IItemViewModel 添加了一个属性组"并修改了 XAML,如下所示:

First of all the TypeConverter is unnecessary, because the PropertyGroupDescription can be bound on a PropertyName. So I added a Property 'Group' to IItemViewModel and modified XAML as follows:

<UserControl.Resources>
 <CollectionViewSource x:Key="GroupedItems" Source="{Binding Items}">
  <CollectionViewSource.GroupDescriptions>
   <PropertyGroupDescription PropertyName="Group"/>
  </CollectionViewSource.GroupDescriptions>
 </CollectionViewSource>
</UserControl.Resources>

此外,HeaderTemplate 的 DataContext 是一个 CollectionViewGroupInternal,绑定必须如下所示:

Furthermore the HeaderTemplate's DataContext is a CollectionViewGroupInternal and the binding has to look like this:

<DataTemplate>
 <TextBlock Text="{Binding Name.DisplayName}" FontWeight="bold" />
</DataTemplate>

这里 CollectionViewGroupInternal.Name 解析实际的 GroupViewModel.

Here CollectionViewGroupInternal.Name resolves the actual GroupViewModel.

这篇关于使用分组绑定 WPF 中的列表框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-24 07:35