如何在 SILVERLIGHT 中使用 MVVM 将子控件绑定到主详细信息方案中的视图对象(如 PageCollec



我有一个关于使用 MVVM 的"主\细节"数据绑定的问题,希望你能帮到我:

假设我的主模型视图是"产品模型视图"(用于产品实体),并且产品实体具有一个名为"产品库存"的属性,类型为"实体集合"。我在主产品模型视图中定义了一个名称为"ProductViewDCV"的"DomainCollectionView"

我执行以下项目来填充我的主数据和详细信息数据网格:

1-将我的页面的数据上下文设置为我的模型视图:产品模型视图

2-将主数据网格(名称:主DG)绑定到产品视图DCV。

3-将详细信息数据网格(名称:detailDG)绑定到我的主产品视图DCV的产品库存属性:

<sdk:DataGrid x:Name=" detailDG " 
                      ItemsSource="{Binding Path= ProductViewDCV. ProductInventories }"/>

程序运行良好,随着我更改主数据网格中的行,子数据网格中的当前项也会更改。

但是我的问题和问题:

  1. 当我绑定我的详细信息(子)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事件处理程序中更新可观察集合的内容。 我认为视图应该自动更新。 抱歉,我对此有点生疏,但我认为这应该适合您。

相关内容