Wpf 实体框架-将导航属性绑定到ListBox

Wpf 实体框架-将导航属性绑定到ListBox,wpf,entity-framework,mvvm,binding,Wpf,Entity Framework,Mvvm,Binding,我正在使用MVVM和实体框架。我有一个名为“Quote”的实体,它有一个名为“QuoteProducts”的导航属性,其中包含Quote中的所有产品 我的ViewModel有一个名为“CurrentQuote”的属性,其类型为“Quote”,并且我的视图具有以下列表框: <ListBox ItemsSource="{Binding CurrentQuote.QuoteProducts}"> 新产品不会出现在列表框中。我一直在阅读,原因似乎是导航属性后面的集合没有通知UI它已更改。但

我正在使用MVVM和实体框架。我有一个名为“Quote”的实体,它有一个名为“QuoteProducts”的导航属性,其中包含Quote中的所有产品

我的ViewModel有一个名为“CurrentQuote”的属性,其类型为“Quote”,并且我的视图具有以下列表框:

<ListBox ItemsSource="{Binding CurrentQuote.QuoteProducts}">
新产品不会出现在列表框中。我一直在阅读,原因似乎是导航属性后面的集合没有通知UI它已更改。但我没有找到一个干净的方法让它做到这一点

我看到了一个解决方案,需要保留一个单独的QuoteProducts列表,绑定到该列表,并在添加产品时将其添加到这两个列表中,但这似乎不是正确的方法


是否有任何方法可以将功能附加到数据模型中,以便在集合发生更改时通知它?

没有,您必须将
CurrentQuote.QuoteProducts
的声明修改为实现
INotifyCollectionChanged
的类。原因很简单-WPF不直接查看
CurrentQuote
对象,而是直接查看
CurrentQuote.QuoteProducts
集合。

我使用的最简单方法是使用ICollectionView,而不是直接绑定到ObservableCollection。仍然使用ObservableCollection作为基础ICollection,但它不会引发UI需要的所有事件。实际上,我尝试在WPF中使用IBindingList而不是OC,因为当从UI更新集合时,OCs从不引发更新事件,您只能知道何时添加或删除某些内容。这并不完全正确,因为您可以监听单个项目属性的更新,但它会根据我的喜好将其抽象到很远的地方。

我唯一真正使用ObservableCollection的地方是Silverlight/WP7,因为别无选择。当用户界面是一个哑视图时,使用它们会更有意义&尽管所有内容都是通过虚拟机添加的,但这对我来说很少见。

EntityObservableCollection在您的场景中可能会有所帮助。此集合的代码和代码示例可以在

BookLibrary示例应用程序中找到,因此,为了确保我理解--我需要在我的ViewModel中创建(例如)一个ObservableCollection,当添加新产品时,将其添加到CurrentQuote,除了ObservableCollection,对吗?您还可以将
CurrentQuote
QuoteProduct
的定义交换到
ObservableCollection
-这将是一种简单的方法。但是,也有可能使
CurrentQuote.QuoteProducts
属性
IList
可重写,而不是显式类,同时提供
CurrentQuote
(即
observatecurrentQuote
)的多个实现。
QuoteProduct product = new QuoteProduct();
product.Product = SelectedProduct;
CurrentQuote.QuoteProducts.Add(product);