在多重选择模式下绑定ListBoxItem的IsSelected属性

本文关键字:ListBoxItem IsSelected 属性 绑定 选择 模式 | 更新日期: 2023-09-27 18:18:55

在WinRT App (c#)中,我有List<Item> items,它绑定到ListBox
Class Item有两个字段:string Namebool IsSelected。正如您已经理解的,我想将IsSelected字段绑定到ListBoxItem的IsSelected属性。

为什么我需要这个?为什么我不使用ListBoxSelectedItems属性?

  1. ListBox刚刚加载时,我已经有一些项目,必须是IsSelected = true
  2. 我不想创建另一个集合来存储所有选中的项目。

我在找什么?
我正在寻找优雅的解决方案,就像在WPF:

 <ListBox.ItemContainerStyle>
  <Style TargetType="ListBoxItem">
    <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
  </Style>
 </ListBox.ItemContainerStyle>

但是我们都知道,WinRT根本不支持setter中的绑定。

我也检查了Filip Skakun博客上的好文章-这是解决方案之一,但我需要自己写一些BindingBuilder/BindingHelper

现在,我知道两种方法来解决我的问题:

  1. 绑定ListBoxSelectedItems属性并存储另一个集合项。-我不喜欢这样
  2. 像philip Skakun那样做-如果我什么都找不到,我就用这个。

在理想情况下,我想使用本机解决方案,或者可能有人已经为我的情况编写/测试了嵌套BindingBuilder -这将是有帮助的。

在多重选择模式下绑定ListBoxItem的IsSelected属性

如何创建一个派生的ListBox:

public class MyListBox : ListBox
{
    protected override void PrepareContainerForItemOverride(
        DependencyObject element, object item)
    {
        base.PrepareContainerForItemOverride(element, item);
        if (item is Item)
        {
            var binding = new Binding
            {
                Source = item,
                Path = new PropertyPath("IsSelected"),
                Mode = BindingMode.TwoWay
            };
            ((ListBoxItem)element).SetBinding(ListBoxItem.IsSelectedProperty, binding);
        }
    }
}