【问题标题】:Entity Framework - Binding Navigation Property to ListBox实体框架 - 将导航属性绑定到 ListBox
【发布时间】:2011-02-20 19:38:07
【问题描述】:

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

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

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

效果很好,在大多数情况下。我加载了一个报价,ListBox 填满了,一切都很棒。但是,当我使用

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

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

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

有什么方法可以在我的数据模型中添加功能,以便在集合发生更改时通知它?

【问题讨论】:

    标签: wpf entity-framework mvvm binding


    【解决方案1】:

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

    【讨论】:

    • 所以,为了确保我理解——我需要在我的 ViewModel 中创建(例如)一个 ObservableCollection,并在添加新产品时将其添加到 CurrentQuote ,还有 ObservableCollection,对吧?
    • 您也可以将CurrentQuote 中的QuoteProduct 的定义交换为ObservableCollection - 这将是一种简单的方法。但是,使CurrentQuote.QuoteProducts 属性IList&lt;T&gt; 和可覆盖而不是显式类,同时提供CurrentQuote 的多个实现(即ObservableCurrentQuote)也是可能的。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-29
        • 2016-05-29
        相关资源
        最近更新 更多