2013-08-29 2 views
0

У меня есть ListBox (x: Name = notesList) в моем приложении WPF, которое берет предметы по ItemsSource из коллекции. Коллекция является Notes собственности в моем классе Data и имеет тип ObservableCollection<Note>. Я связываю это следующим образом: (data является Data объект, который имеет некоторые элементы в Notes)TwoWay binding listbox - удаляемый элемент

Binding bind = new Binding(); 
bind.Mode = BindingMode.TwoWay; 
bind.Source = data; 
bind.Path = new PropertyPath("Notes"); 
notesList.SetBinding(ListBox.ItemsSourceProperty, bind); 

В переплетные работы, элементы отображаются в ListBox. Я установил привязку TwoWay, потому что я хочу, чтобы коллекция notesList и Notes была синхронизирована. Проблема возникает при попытке удалить выбранный элемент таким образом:

NotesList.Items.RemoveAt(notesList.SelectedIndex); 

я получаю исключение: «Операция не действует при ItemsSource используется доступ и изменять элементы с ItemsControl.ItemsSource вместо этого.».

Мой вопрос: Должен ли я использовать функцию коллекции для удаления элемента? data.Notes.RemoveAt(index)? Есть ли способ удалить элемент, используя класс ListBox, чтобы он привел к удалению элемента в коллекции? Я думал, что использование TwoWay Binding станет возможным.

ответ

1

Все это означает, что, когда вы использовали свойство ItemsSource для привязки коллекции к элементу управления коллекцией, вы не можете удалить элементы из этого элемента управления. Не волнуйтесь, есть действительно простое решение. Удалить элемент из коллекции вместо:

data.Notes.Remove(data.Notes.Where(n => n == notesList[notesList.SelectedIndex]). 
FirstOrDefault()); 

Это лучше не использовать контроль в коде позади ... если привязать свойство к ComboBox.SelectedItem собственности, то вы можете просто сделать это:

public Note SelectedNote { get; set; } // should implement INotifyPropertyChanged 

... затем ...

data.Notes.Remove(SelectedNote);