我有一个关于使用 MVVM 的"主\细节"数据绑定的问题,希望你能帮到我:
假设我的主模型视图是"产品模型视图"(用于产品实体),并且产品实体具有一个名为"产品库存"的属性,类型为"实体集合"。我在主产品模型视图中定义了一个名称为"ProductViewDCV"的"DomainCollectionView"
我执行以下项目来填充我的主数据和详细信息数据网格:
1-将我的页面的数据上下文设置为我的模型视图:产品模型视图
2-将主数据网格(名称:主DG)绑定到产品视图DCV。
3-将详细信息数据网格(名称:detailDG)绑定到我的主产品视图DCV的产品库存属性:
<sdk:DataGrid x:Name=" detailDG "
ItemsSource="{Binding Path= ProductViewDCV. ProductInventories }"/>
程序运行良好,随着我更改主数据网格中的行,子数据网格中的当前项也会更改。
但是我的问题和问题:
- 当我绑定我的详细信息(子)DataGrid(如步骤3中提到的)时,子数据网格绑定到"实体集合"而不是像"PagedCollectionView"或"DomainCollectionView"这样的视图对象,所以我不能在我的子(detail)DataGrid上使用排序,分组和分页等好处。我想知道:如何将我的子数据网格绑定到 MVVM 模式中的视图对象以使用分页选项。(即,我希望在我的子数据网格中具有分页和分组选项。
期待收到您的回复。
你好。
我非常感谢您的友好和快速的回答。我按照你说的做了,但我遇到了一个问题,希望你帮助我:
方法:
在我的"产品模型视图"(用于产品实体)中,我定义了以下对象:
1-私有域名收藏查看_ProductViewDCV;(作为主(父)视图)
2-私人分页收藏查看_ProductViewPCV;(作为详细(子)视图)
在"ProductModelView"类的3-构造函数中,我将一个EVentHandler分配给"_ProductViewDCV"(我的DomainCollectionView作为主视图):
this._ProductViewDCV.CurrentChanged+=_ProductViewDCV_CurrentChanged;
this._ProductViewDCV.Refresh();
4-在事件处理程序中,我创建了一个新的"PagedCollectionView"(我的详细信息/子视图)并将其分配给我的_ProductViewDCV:
if (_ProductViewDCV.CurrentItem != null)
{
_ProductViewPCV = new PagedCollectionView((_ProductViewDCV.CurrentItem as BA1.Web.Product).ProductInventories);
//ProductViewPCV.Refersh();
}
5-在我的视图文件(XAML文件)中,我有两个数据网格,配置如下:
Page DataContext is set to an object of my ModelView : ProductViewModel
sdk:DataGrid x:Name="dgParent" Grid.Row="1" ItemsSource="{Binding Path=ProductViewDCV}"//my Master/Parent DataGrid
sdk:DataGrid Grid.Row="2" x:Name="dgDetails" ItemsSource="{Binding Path=ProductViewPCV}//My Detail/Child DataGrid
问题:
当我更改主/父数据网格中的当前行时,详细信息/子数据网格中没有任何反应,并且测试详细信息/子数据网格的 Itemssource 属性,返回"Null",而不是"PagedCollectionview"的对象。
我的问题在哪里,为什么没有更新详细信息/子数据网格以响应主/父当前项的更改?(测试表明,当 ProductViewPCV 的父集合更改时,它本身也会发生变化。
让我再次感谢您就此问题给我建议。
在我的头顶上,我可以看到一些问题。 应在构造函数中实例化 _ProductViewPCV PagedCollectionView 属性,而不是在 _ProductViewDCV_CurrentChanged 事件处理程序中创建它的新实例。 如果确实要执行此操作,则需要通过引发 PropertyChanged 事件来通知视图此_ProductViewPCV属性的值已更改。 但是,不应执行此操作,因为它可能会导致内存泄漏。
您最好将可观察集合包装在PagedCollectionView中,并简单地在我认为_ProductViewDCV_CurrentChanged事件处理程序中更新可观察集合的内容。 我认为视图应该自动更新。 抱歉,我对此有点生疏,但我认为这应该适合您。