Я хочу обязать Поле списка selectedItems выстраивать. Но.NET выдает исключение во времени выполнения.
d.SetBinding(ListBox.SelectedItemsProperty, new Binding { Source = SomeArray });
Где d
некоторый ListBox от XAML.
Исключение:
Выбранный пункт не может быть связан.
Почему?
Это рабочее решение, однако при изменении выбора 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();
}
};
Вы можете подписаться на событие 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);
}
}
ListBox.SelectedItems
только для чтения. Вы хотели привязать к ListBox.SelectedItem
вместо этого?
Я не уверен, правильно ли я понял ваш вопрос или точный сценарий - но если вы хотите, чтобы один listbox "d" показывал элементы, которые были выбраны в другом listbox "MyOtherListbox", то вам просто нужно установить режим привязки на 'one way', иначе это приведет к ошибке.
Вы можете сделать что-то вроде
d.SetBinding(ListBox.ItemsSourceProperty, new Binding { Source = MyOtherListbox.SelectedItems, Mode = BindingMode.OneWay});