使用EF Code-First时是否需要实现INotifyPropertyChanged?

时间:2011-08-09 04:35:19

标签: entity-framework mvvm ef-code-first observablecollection

我注意到在使用EF CodeFirst时,通过DBSet.Local属性推荐here将我的UI绑定到ObservableCollection<T>,当实体添加到{{3}}时,UI会更新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,即使我在我的ViewModel中使用它?

2 个答案:

答案 0 :(得分:3)

是,

修改属性时要更新UI的每个元素都必须实现INotifyPropertyChange。

原因是,UI知道集合何时更改,但如果其中一个元素的属性发生更改,则没有与之关联的CollectionChanged事件,因此UI无知

另请参阅:Entity Framework CTP5 Code First, WPF - MVVM modeling

答案 1 :(得分:0)

这是一个糟糕的答案,但我将其包括在内以帮助理解这个问题。

似乎答案是“是”你必须在你的模型中实现INotifyPropertyChanged以获得控件的通知以便通知他们的更改(从而允许控件在更改时更新)。

但如果上述情况属实,为什么TextBox数据绑定到实体会导致其他控件发生更改。

试试吧!例如,您可以使用UpdateSourceTrigger = PropertyChanged将TextBox的Text属性绑定到DataGrid的SelectedItem(它与.Local中的ObservableCollection绑定)。现在运行并在DataGrid中选择一行并编辑TextBox,DataGrid行中的文本将实时更新!文本框如何强制在DataGrid中进行更改!?!?!

以下是上述示例的绑定代码:

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

这不仅适用于同一个View上的TextBox,但即使从SelectedItem收集实体并将其传入第二个视图,然后该视图具有绑定到实体的TextBox。 (管理以实时更新第一个窗口的DataGrid!)

这太酷了!现在我希望我能在代码中找到一种方法SelectedItem.Name =“New Name”,因为无论我尝试什么都不会更新DataGrid。 (我无法直接刷新DataGrid,因为我使用的是MVVM并且无法访问它)

注意:我正在使用带有DBContext&amp;的EF4.1。 POCO实体(即没有实现任何接口的简单类)