【问题标题】:ICollection.Add(item) don´t raise propertychanged MVVM datagridICollection.Add(item) don´t raise propertychanged MVVM datagrid
【发布时间】:2015-10-16 14:27:53
【问题描述】:

我的问题是: 我首先使用 EF 代码,我得到了一个主详细信息的情况,主有一个孩子,它是数据网格的 itemsSource,如下所示:

<DataGrid ItemsSource="{Binding Path=Transaction.StockItems,Mode=TwoWay}" 
          SelectedItem="{Binding Path=StockItem, Mode=TwoWay}" 
          AutoGenerateColumns="False" IsReadOnly="True">
    <DataGrid.Columns>
        <mui:DataGridTextColumn Width="0.12*" Binding="{Binding Name}"/>
        <mui:DataGridTextColumn Width="0.12*" Binding="{Binding Cod}"/>
        <mui:DataGridTextColumn Width="0.12*" Binding="{Binding Cost}"/>
        <mui:DataGridTextColumn Width="0.15*" Binding="{Binding Qt}"/>
    </DataGrid.Columns>
</DataGrid>

在我的 ViewModel 中,我得到了 Transaction 属性的属性,如下所示:

    private tTran_t;
    public tTransaccion Transaction
    {
        get { return _t; }
        set { _t= value; RaisePropertyChanged("Transaction"); }
    }

在我的 ViewModel 的其他方法中,我对集合执行 Add(),如下所示:

    Transaction.StockItems.Add(myNewLine);
    RaisePropertyChanged("Transaction");

在我的模型中,Transaction.StockItems 的定义是ICollection

问题:数据网格从未更新

我猜这是因为从未调用过RaisPropertyChanged(),因为从未设置过集合,但正如您所见,我确实调用了Transaction 对象的RaisPropertyChanged()

提前致谢

【问题讨论】:

  • 您的 Transaction 属性应该是 ObesrvableCollection 其中 T 是您要显示的模型
  • 问题是事务属性中的集合是 iCollection,它是由 EFcodeFirst public virtual ICollection StockItem { get;放;我应该更改 EFCodeFirst 分配的类型吗?
  • 没有。据我所知,将 EF 生成的实体用作 MVVM 或 MVP 设计模式是一个坏习惯。您可以使用 [DTO][1] 或从 EF 模型创建自定义模型。 [1]:msdn.microsoft.com/en-us/library/ff649585.aspx
  • 这不是一个坏习惯。拥有两组具有完全相同属性的类必须来回转换是非常浪费时间的。当您将项目添加到属性 B 时,为属性 A 发出属性更改通知也是如此。StockItems 应该是实现 INotifyCollectionChanged 的​​集合。看起来 OP 只是将随机代码复制粘贴到他的应用程序中。
  • @Will,你说得对。(坏习惯不是我想用的好词)我习惯做这种分离以避免强烈的依赖。业务逻辑与我选择的客户端应用程序设计模式分离。当使用这种分离时,我在升级 EF 时只需要在我的业务逻辑中做一些工作。我的客户端应用程序不会受到影响。 :)

标签: c# wpf entity-framework mvvm datagrid


【解决方案1】:

将项目添加到集合中不会“改变”对象本身。设置集合本身时会引发 RaisepropertyChanged。所以你需要做的是为你的集合引用分配一个新集合。因此,首先您将项目添加到临时集合中,然后执行transaction = new collection(temporaryCollection),然后您的 UI 将不会收到更改通知。

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 2022-12-02
    • 2013-01-27
    • 2014-12-03
    • 2022-12-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2022-12-02
    相关资源
    最近更新 更多