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

时间:2011-02-20 19:38:08

标签: wpf entity-framework mvvm binding

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

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

<ListBox ItemsSource="{Binding CurrentQuote.QuoteProducts}">

在大多数情况下,效果很好。我加载一个引号,ListBox填满,一切都超级。但是,当我使用

添加新产品时
QuoteProduct product = new QuoteProduct();
product.Product = SelectedProduct;
CurrentQuote.QuoteProducts.Add(product);

新产品未出现在ListBox中。我一直在做一些阅读,看起来原因是因为导航属性背后的集合没有通知UI它已经改变了。但是我没有找到的是一种干净的方法来让它做到这一点。

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

有没有什么方法可以解决我的数据模型的功能,让它在集合发生变化时通知?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我使用的最简单方法是直接绑定到ObservableCollection,使用ICollectionView。仍然使用ObservableCollection作为底层ICollection,但它不会引发UI所需的所有事件。我实际上尝试在WPF中使用IBindingList而不是OC,因为当从UI更新集合时,OCs从不会引发更新的事件,您只能知道何时添加或删除了某些内容。这并不完全正确,因为您可以听取单个项目属性更新,但它会根据我的喜好将其抽象到远处 我真正使用ObservableCollection的唯一地方是Silverlight / WP7,因为别无选择。当UI是一个愚蠢的视图时,它们确实更有意义。一切都是通过虚拟机添加的,但这对我来说很少见。

答案 2 :(得分:0)

EntityObservableCollection可能对您的方案有所帮助。可以在 WPF Application Framework (WAF) BookLibrary 示例应用程序中找到此集合的代码和代码示例。