2014-02-11 2 views
3

У меня есть контейнер, такой как listbox, combobox и т. Д., Что его свойство ItemsSource привязано к наблюдаемой коллекции в моей модели представления. Когда я пытаюсь добавить/удалить элементы из коллекции с помощью какого-либо метода в моей виртуальной машине, он не будет отражен в пользовательском интерфейсе, Единственный способ, которым пользовательский интерфейс действительно обновит, - это если я присвою коллекции новое значение (то есть другое сбор с соответствующими данными), что заставляет его перевязывать всю коллекцию.WPF MVVM ListBox/ComboBox ItemsSource не обновляет пользовательский интерфейс из ViewModel

Возможно, я отсутствует/не понимаю что-то о проблеме с привязкой к коллекции, так или иначе, если у кого-то есть решение/хорошее объяснение/оба варианта будут замечательными. вот пример из моего зрения (в данном случае сво ListBox)

<ListBox 
       Grid.Row="9" 
       Grid.Column="1" 
       Grid.ColumnSpan="3" 
       Width="200" 
       Height="200" 
       ItemsSource="{Binding PreSavedRecordingScheduleList,UpdateSourceTrigger=PropertyChanged}" 
       SelectedItem="{Binding SelectedPreSavedRecordingSchedule,UpdateSourceTrigger=PropertyChanged}" 
       DisplayMemberPath="Display"/> 

и вот мой ViewModel:

private ObservableCollection<ScheduledRecordingObject> m_PreSavedRecordingScheduleList; 

PreSavedRecordingScheduleList = new ObservableCollection<ScheduledRecordingObject>(); 

public ObservableCollection<ScheduledRecordingObject> PreSavedRecordingScheduleList 
     { 
      get 
      { 
       return m_PreSavedRecordingScheduleList; 
      } 
      set 
      { 
       m_PreSavedRecordingScheduleList = value; 
       OnPropertyChanged("PreSavedRecordingScheduleList"); 
      } 
     } 

ScheduledRecordingObject также реализует INotifyPropertyChanged.

+2

Покажите свои попытки кода – Sheridan

+0

только для лучшего понимания - начальные значения в вашей коллекции указаны в вашем списке? – blindmeis

+0

Да, начальные значения показаны. я могу, например, добавить несколько элементов в C'tor, и они будут видны пользователю, но любое изменение, которое я делаю после (добавить/удалить/очистить и т. д.), не обновляет UI – user1531186

ответ

0

ViewModel

public ObservableCollection<yourType> MyItemsSource {get;set} 

инициализировать один раз в застройщик и использовать ясно, добавлять и удалять, чтобы изменить его

вид

<ListBox ItemsSource="{Binding MyItemsSource}"/> 

только убедитесь, что право DataContext устанавливается.

вот как это должно выглядеть в коде

EDIT: некоторые намеки на ваш публикуемую код:

//remove the UpdateSourceTrigger=PropertyChanged - makes no sense the Mode is OneWay anyway :) 
ItemsSource="{Binding PreSavedRecordingScheduleList}" 

//the following line should just called once and at best in ctor 
//but the binding will of course work too when you assign a new collection 
PreSavedRecordingScheduleList = new ObservableCollection<ScheduledRecordingObject>(); 

все во всем коде выглядит хорошо, и если ViewModel является DataContext вашей Listbox тогда он должен работать. дайте мне знать, что показывает Snoop :)

+0

спасибо, что я уже пробовал, и это часть, где вы сказали использовать clear/add/remove для изменения коллекции, не работает. – user1531186

+0

PLS использовать snoop во время выполнения, чтобы проверить, не нарушена ли первоначальная привязка. и PLS после какого-то кода – blindmeis

+0

не знал, что такой инструмент существует до сих пор, поэтому я просто загрузил его, и я собираюсь дать ему попробовать. – user1531186

0

Удалить OnPropertyChanged («PreSavedRecordingScheduleList»); из ObservableCollection. На самом деле вам не нужно поле поддержки. Приложить событие CollectionChanged на ObservableCollection, что-то вроде этого

1- Внутри конструктора ViewModel прикрепить событие CollectionChanged

PreSavedRecordingScheduleList = new ObservableCollection<ScheduledRecordingObject>(); 

PreSavedRecordingScheduleList.CollectionChanged += PreSavedRecordingScheduleList_CollectionChanged; 

2- Инжектируйте OnPropertyChanged ("PreSavedRecordingScheduleList") в обработчик события

void PreSavedRecordingScheduleList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     OnPropertyChanged("PreSavedRecordingScheduleList"); 
    } 
Смежные вопросы