Привязка ListBox SelectedItems

Я хочу обязать Поле списка selectedItems выстраивать. Но.NET выдает исключение во времени выполнения.

d.SetBinding(ListBox.SelectedItemsProperty, new Binding { Source = SomeArray });

Где d некоторый ListBox от XAML.

Исключение:

Выбранный пункт не может быть связан.

Почему?

8
задан ΩmegaMan 23 August 2016 в 14:31
поделиться

4 ответа

Это рабочее решение, однако при изменении выбора SelectedItemsProperty не обновляет привязки ...

вы можете создать настраиваемый элемент управления следующим образом

public class MyListBox: ListBox{

    public MyListBox()
    { 
         this.SelectionChanged += (s,e)=>{ RefreshBindings(); };
    }

    private void RefreshBindings()
    {
         BindingExpression be = 
             (BindingExpression) GetBindingExpression(
                                      SelectedItemsProperty);
         if(be!=null){
               bd.UpdateTarget();
         }
    }

}

или в своем приложении вы можете определить событие в каждом списке, как показано ниже.

myListBox.SelectionChanged += (s,e) => {
    BindingExpression be = 
         (BindingExpression) myListBox.GetBindingExpression(
                                      ListBox.SelectedItemsProperty);
    if(be!=null){
        bd.UpdateTarget();
    }
};
3
ответ дан 5 December 2019 в 12:56
поделиться

Вы можете подписаться на событие SelectionChanged для ListBox и в обработчике синхронизировать коллекцию выбранных элементов.

В этом примере Windows DataContext был установлен на себя (this) в его конструкторе. Вы также можете легко вызвать логический уровень (ViewModel, если вы используете MVVM) из обработчика событий.

В Xaml:

<StackPanel>

    <ListBox
        ItemsSource="{Binding ListBoxItems}"
        SelectionMode="Multiple"
        SelectionChanged="ListBox_SelectionChanged">
    </ListBox>

    <ItemsControl
        ItemsSource="{Binding SelectedItems}">
    </ItemsControl>

</StackPanel>

И в коде программной части:

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    foreach (string item in e.RemovedItems)
    {
        SelectedItems.Remove(item);
    }

    foreach (string item in e.AddedItems)
    {
        SelectedItems.Add(item);
    }
}
8
ответ дан 5 December 2019 в 12:56
поделиться

ListBox.SelectedItems только для чтения. Вы хотели привязать к ListBox.SelectedItem вместо этого?

1
ответ дан 5 December 2019 в 12:56
поделиться

Я не уверен, правильно ли я понял ваш вопрос или точный сценарий - но если вы хотите, чтобы один listbox "d" показывал элементы, которые были выбраны в другом listbox "MyOtherListbox", то вам просто нужно установить режим привязки на 'one way', иначе это приведет к ошибке.

Вы можете сделать что-то вроде

d.SetBinding(ListBox.ItemsSourceProperty, new Binding { Source = MyOtherListbox.SelectedItems, Mode = BindingMode.OneWay});
1
ответ дан 5 December 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: