【发布时间】: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