Свойство Bind IsSelected объекта ListBoxItem в ListBox с режимом множественного выбора

В WinRT App (C#) у меня есть List<Item> items, которые связываются с ListBox,
Class Item имеет 2 поля: string Name а также bool IsSelected, Как вы уже поняли, я хочу связать IsSelected Поле IsSelected Свойство ListBoxItem.

Зачем мне это нужно? Почему я не использовал SelectedItems собственность моего ListBox?

  1. когда ListBox только что загружен, у меня уже есть некоторые предметы, которые должны быть IsSelected = true
  2. Я не хочу создавать другую коллекцию для хранения всех выбранных элементов.

Что я ищу?
Я ищу элегантное решение, как в WPF:

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

Но мы все знаем, что WinRT вообще не поддерживает привязки в установщиках.

Я также проверяю хороший пост в блоге Filip Skakun - и это одно из решений, но мне нужно написать некоторые из BindingBuilder/BindingHelper сам.

И теперь я знаю два способа решения моей проблемы:

  1. привязывать SelectedItems собственностью ListBox и хранить другую коллекцию предметов. - Мне не нравится этот способ
  2. Делай это как 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);
        }
    }
}
Другие вопросы по тегам