Нужно ли реализовывать INotifyPropertyChanged при использовании EF Code-First? - PullRequest
1 голос
/ 09 августа 2011

Я замечаю, что при использовании EF CodeFirst и привязке моего пользовательского интерфейса к ObservableCollection<T> через свойство DBSet.Local рекомендуется здесь , что пользовательский интерфейс будет обновляться, когда объектыдобавляются в DBContext, но не при их изменении.

Может показаться, что коллекция DBSet.Local не уведомляется об изменении моих сущностей.При использовании EF Code-First нужно ли вводить INotifyPropertyChanged для всех моих полей?Я не видел этого ни в одном из примеров Code-First, и это, кажется, идет вразрез с целью, но, возможно, я ошибаюсь.

Я могу опубликовать пример кода, если вы чувствуете, что ObservableCollectionдолжен получать уведомления об изменениях и что-то должно быть не так в моих классах сущностей или что-то в этом роде.

Редактировать Итак, просто чтобы быть уверенным, если у меня есть код, подобный следующему в моей ViewModel

private ClientContext clientContext;
private Client client;
public Client Client
{
    get { return client; }
    set { 
          client = value; 
          NotifyOfPropertyChange(() => Client);
          NotifyOfPropertyChange(() => Clients);
        }
}
public ObservableCollection<Client> Clients { get { return clientContext.Clients.Local; }}

Давайте также предположим, что у моего View есть Listbox с Itemssource, установленным в Clients, и SelectedItem, установленным в Client.Мне все еще нужно реализовать INotifyPropertyChanged в моей модели, хотя я использую его в своей модели представления?

Ответы [ 2 ]

3 голосов
/ 09 августа 2011

Да,

Каждый элемент, который вы хотите обновить в пользовательском интерфейсе при изменении его свойства, должен реализовывать INotifyPropertyChange.

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

См. Также: Entity Framework CTP5 Code First, WPF - MVVM моделирование

0 голосов
/ 11 августа 2011

Это плохой ответ, но я включил его сюда, чтобы внести вклад в понимание вопроса.

Казалось бы, ответом будет "ДА", вы должны реализовать INotifyPropertyChanged в своей модели для элементов управлениячтобы получать уведомления об их изменении (таким образом, позволяют элементам управления обновляться при их изменении).

Но если вышеприведенное является верным, то почему привязка данных TextBox к объекту может вызвать изменения в других элементах управления.

Попытайся!Например, вы можете привязать свойство Text TextBox к SelectedItem объекта DataGrid (который связан с ObservableCollection из .Local) с помощью UpdateSourceTrigger = PropertyChanged.Теперь запустите и выберите строку в DataGrid и отредактируйте TextBox, и текст в строке DataGrid будет обновляться в реальном времени!Как текстовое поле вызывает изменение в DataGrid!?!?!

Вот код привязки приведенного выше примера:

<TextBox Text="{Binding Path=SelectedItem.Name, UpdateSourceTrigger=PropertyChanged}" />

Это работает с TextBox не только нато же самое представление, но даже если сущность собирается из SelectedItem и передается во второе представление, которое затем имеет TextBox, который связывается с сущностью.(Удается обновить DataGrid первого окна в реальном времени!)

Это супер круто!Теперь я хотел бы найти способ в коде SelectedItem.Name = "New Name", потому что, что бы я ни пытался, это не будет обновлять DataGrid.(Я не могу обновить DataGrid напрямую, потому что я использую MVVM и не имею к нему доступа)

Примечание: я использую EF4.1 с сущностями DBContext & POCO (то есть простыми классами, которые нереализовать любые интерфейсы)

...