Свойство Bind IsSelected объекта ListBoxItem в ListBox с режимом множественного выбора
В WinRT App (C#) у меня есть List<Item> items
, которые связываются с ListBox
,Class Item
имеет 2 поля: string Name
а также bool IsSelected
, Как вы уже поняли, я хочу связать IsSelected
Поле IsSelected Свойство ListBoxItem.
Зачем мне это нужно? Почему я не использовал SelectedItems
собственность моего ListBox
?
- когда
ListBox
только что загружен, у меня уже есть некоторые предметы, которые должны бытьIsSelected = true
- Я не хочу создавать другую коллекцию для хранения всех выбранных элементов.
Что я ищу?
Я ищу элегантное решение, как в WPF:
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
Но мы все знаем, что WinRT вообще не поддерживает привязки в установщиках.
Я также проверяю хороший пост в блоге Filip Skakun - и это одно из решений, но мне нужно написать некоторые из BindingBuilder/BindingHelper
сам.
И теперь я знаю два способа решения моей проблемы:
- привязывать
SelectedItems
собственностьюListBox
и хранить другую коллекцию предметов. - Мне не нравится этот способ - Делай это как Filip Skakun - если я ничего не найду, я использую это.
В идеальной ситуации я хочу использовать для этого нативное решение, или, может быть, кто-то уже написал / протестировал вложенный BindingBuilder
для моей ситуации - это тоже будет полезно.
1 ответ
Как насчет создания производного 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);
}
}
}