【问题标题】:Bind listbox in WPF with grouping使用分组绑定 WPF 中的列表框
【发布时间】:2010-04-07 20:26:51
【问题描述】:

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

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

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 的属性进行分组吗?

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

【问题讨论】:

    标签: wpf binding listbox grouping


    【解决方案1】:

    好的,我终于自己解决了。

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

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

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

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

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

    【讨论】:

    • 为什么在文本块的文本绑定部分使用 Name.DisplayName?您从哪里获得对象“名称”?
    • Name 是 CollectionViewGroupInternal 的一个参数
    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2018-10-23
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多