1

我注意到,當使用EF CodeFirst,並通過DBSet.Local屬性建議here將我的UI綁定到ObservableCollection<T>時,當實體添加到DBContext時UI會更新,但在修改時不會更新。使用EF Code-First時是否需要實現INotifyPropertyChanged?

似乎DBSet.Local集合未被通知我的實體已更改。在使用EF代碼時 - 首先,我是否需要爲我的所有字段實施INotifyPropertyChanged?我在Code-First的任何例子中都沒有看到這個,它似乎違背了目的,但也許我錯了。

我可以發佈一些示例代碼,如果你覺得ObservableCollection應該接收變化通知,並且在我的實體類或其他東西必須是錯誤的。

編輯所以,只是可以肯定,如果我有一個在我的視圖模型下面的代碼

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; }} 

讓我們假設我的視圖都有的ItemsSource一個列表框設置爲客戶機和的SelectedItem設置爲Client 。我仍然需要在我的模型中實現INotifyPropertyChanged,儘管我在ViewModel中使用它。

+0

如果客戶端對象本身在ViewModel中發生了更改(對象引用的更改),但是例如客戶端的「名稱」或「城市」發生更改,則只會得到更改通知。爲此,您必須在客戶模型類的每個屬性上實施更改通知。 – Slauma

回答

3

是,

要更新時,它的屬性被修改必須實現INotifyPropertyChange用戶界面的每一個元素。

這樣做的原因是,該UI知道集合發生更改時,但如果這些元素的變化之一的財產,有沒有與之相關的CollectionChanged事件,所以用戶界面是無知

參見: Entity Framework CTP5 Code First, WPF - MVVM modeling

+0

我編輯了我的問題,請求進一步澄清。您還會注意到,在提供最終評論的鏈接中提到使用DBSet.Local提供了一個ObservableCollection,它本身實現了INotifyPropertyChanged。 – dpeterson

+0

@meh:ObservableCollection的'INotifyPropertyChanged'實現並不實際監視集合的子節點的屬性更改:http://social.msdn.microsoft.com/forums/en-US/wpf/thread/9c5c9389 -4db2-44ea-a1f0-2a91a775691f – Slauma

+0

我在我的模型類中實現了INotifyPropertyChanged,看起來像EF Code First應該關注它自己。/rant由於你們兩個人的緣故,不知道EF在Code-First的底線下做了些什麼。 – dpeterson

0

這是一個不好的答案,但我在這裏包括它來幫助理解這個問題。

看起來答案是「YES」,您必須在控件的模型中實現INotifyPropertyChanged以獲取其更改的通知(從而允許控件在更改時更新)。

但是,如果以上情況屬實,爲什麼TextBox數據綁定到實體會導致其他控件的更改。

試試吧!例如,您可以使用UpdateSourceTrigger = PropertyChanged將TextBox的Text屬性綁定到DataGrid的SelectedItem(它綁定到來自.Local的ObservableCollection)。現在運行並選擇DataGrid中的一行並編輯TextBox,DataGrid行中的文本將實時更新!文本框如何在DataGrid中強制改變!!!?!

這裏是上面的例子中的綁定代碼:

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

不只是在同一個視圖中,但是如果實體是從的SelectedItem收集和傳遞到第二視圖這適用於一個TextBox其然後有一個綁定到實體的TextBox。 (管理更新第一個窗口的DataGrid實時!)

這是超酷!現在我希望能夠在代碼中找到一種方法SelectedItem.Name =「New Name」,因爲不管我嘗試什麼都不會更新DataGrid。(我無法直接刷新DataGrid,因爲我正在使用MVVM並且無法訪問它)

注意:我在使用EF4.1和DBContext & POCO實體(即沒有實現任何類的簡單類接口)

+4

將文本框綁定到DataGrid中的SelectedItem工作,因爲SelectedItem是一個依賴項屬性:http://msdn.microsoft.com/en-us /library/ms752914.aspx 依賴屬性處理自己的自動更新,不需要實現INotifyPropertyChange。它們是一種UI特有的屬性 –

相關問題