使用多选模式在ListBox中绑定ListBoxItem的IsSelected属性

时间:2013-06-19 06:43:32

标签: c# xaml windows-8 windows-runtime

在WinRT应用程序(C#)中,我有List<Item> items,绑定到ListBox
Class Item有两个字段:string Namebool IsSelected。如您所知,我想将IsSelected字段绑定到ListBoxItem的IsSelected属性。

为什么我需要这个?为什么我没有使用SelectedItems的{​​{1}}属性?

  1. 刚加载ListBox时,我已经有了一些项目,必须是ListBox
  2. 我不想创建另一个集合来存储所有选定的项目。
  3. 我在找什么? 我正在寻找优雅的解决方案,就像在WPF中一样:

    IsSelected = true

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

    我还检查了nice post博客中的Filip Skakun - 这是解决方案之一,但我需要自己写一些 <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="IsSelected" Value="{Binding IsSelected}"/> </Style> </ListBox.ItemContainerStyle>

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

    1. 绑定BindingBuilder/BindingHelper的{​​{1}}属性并存储其他项目集合。 - 我不喜欢这样
    2. 就像Filip Skakun一样 - 如果我什么都找不到,我会用它。
    3. 在理想情况下,我想为此使用本机解决方案,或者可能已经为我的情况编写/测试过嵌套SelectedItems的人 - 它也会有所帮助。

1 个答案:

答案 0 :(得分:2)

如何创建派生的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);
        }
    }
}
相关问题