在多重选择模式下绑定ListBoxItem的IsSelected属性
本文关键字:ListBoxItem IsSelected 属性 绑定 选择 模式 | 更新日期: 2023-09-27 18:18:55
在WinRT App (c#)中,我有List<Item> items
,它绑定到ListBox
。Class Item
有两个字段:string Name
和bool IsSelected
。正如您已经理解的,我想将IsSelected
字段绑定到ListBoxItem的IsSelected属性。
为什么我需要这个?为什么我不使用ListBox
的SelectedItems
属性?
- 当
ListBox
刚刚加载时,我已经有一些项目,必须是IsSelected = true
- 我不想创建另一个集合来存储所有选中的项目。
我在找什么?
我正在寻找优雅的解决方案,就像在WPF:
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
但是我们都知道,WinRT根本不支持setter中的绑定。
我也检查了Filip Skakun博客上的好文章-这是解决方案之一,但我需要自己写一些BindingBuilder/BindingHelper
。
现在,我知道两种方法来解决我的问题:
- 绑定
ListBox
的SelectedItems
属性并存储另一个集合项。-我不喜欢这样 - 像philip Skakun那样做-如果我什么都找不到,我就用这个。
在理想情况下,我想使用本机解决方案,或者可能有人已经为我的情况编写/测试了嵌套BindingBuilder
-这将是有帮助的。
如何创建一个派生的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);
}
}
}