我正在使用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列表,绑定到它,并在添加产品时添加到它们中,但这似乎不是正确的方法。
有没有什么方法可以解决我的数据模型的功能,让它在集合发生变化时通知?
答案 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 示例应用程序中找到此集合的代码和代码示例。