Я боролся с получением привязки данных для работы в WPF чуть более недели. Я получил ценную помощь здесь в отношении DataContext, и я получил привязку данных для работы через DependencyProperties. Пока я узнавал о привязке данных, я столкнулся с многочисленными дискуссиями о INotifyPropertyChanged
и о том, как это лучше, чем DP во многих отношениях. Я подумал, что сделаю это и попробую.Databinding с INotifyPropertyChanged вместо DependencyProperties
Я использую базовый класс ViewModel для базы Джоша Смита, и моя модель ViewModel получена из него. Тем не менее, у меня есть немного проблем с получением привязки данных для работы, и я надеюсь, что кто-то здесь может сказать мне, где я ошибаюсь.
В моем классе ViewModel у меня есть ObservableCollection<string>
. В моей GUI, у меня есть выпадающий, который связан с этой ОС, т.е.
<ComboBox ItemsSource="{Binding PluginNames}" />
DataContext Графический интерфейс пользователя имеет значение в ViewModel, т.е.
private ViewModel _vm;
public GUI()
{
InitializeComponent();
_vm = new ViewModel();
this.DataContext = _vm;
}
и ViewModel имеет OC под названием "PluginNames" :
public class ViewModel
{
public ObservableCollection<string> PluginNames; // this gets instantiated and added to elsewhere
}
Когда GUI загружен, вызывается метод, который создает экземпляр OC и добавляет имена плагинов к нему. После изменения ОС я вызываю RaisePropertyChanged("PluginNames")
. Я ожидал, что, поскольку модель привязки данных WPF осведомлена о INotifyPropertyChanged, это все, что мне нужно было сделать, и это «волшебно работает» и обновляет элементы combobox с загружаемыми плагинами ... но это не так.
Может кто-нибудь указать, что я сделал не так? Благодаря!
UPDATE: Я не уверен, почему, но теперь вместо того, чтобы не делать какого-либо явного обновления, он не находит свойство вообще. Я думаю, что я действительно глуп и пропущу важный шаг.
Не используйте автоматические свойства - они не поднимают событие PropertyChanged. – itowlson
совершенно правый. Argh! В конце концов, я поправимся. :) – Dave
Является ли правильным SO этикетом, чтобы принять самый старый правильный ответ? Я так полагаю. – Dave