如何将子控件绑定到视图对象(如PageCollectionView)在Master \ Detail场景中使用MVVM在SILVERLIGHT中

时间:2015-01-24 08:31:35

标签: silverlight

我对使用MVVM的“Master \ Detail”数据绑定有疑问,我希望你能帮助我:

假设我的Master ModelView是“ProductModelView”(对于产品实体),而Product Entity有一个名为ProductInventories的属性,类型为Entity Collection。我在我的主ProductModelView中定义了一个名为“ProductViewDCV”的“DomainCollectionView”

我执行以下项目来填充我的主人和详细信息Datagrids:

1 - 将我页面的DataContext设置为ModelView:ProductModelView

2将主Datagrid(名称:masterDG)绑定到ProductViewDCV。

将Datagrid(name:detailDG)的详细信息绑定到我的主ProductViewDCV的ProductInventories属性:

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

该程序运行良好,当我更改主DataGrid中的行时,子DataGrid中的当前项也会更改。

但我的问题和问题:

  1. 当我按照步骤3中提到的绑定我的detail(child)DataGrid时,子DataGrid被绑定到“EntityCollection”而不是View对象,如“PagedCollectionView”或“DomainCollectionView”,所以我不能使用像Sorting这样的好处,对我的孩子进行分组和分页(详细信息)DataGrid。我想知道:我如何将我的子DataGrid绑定到MVVM模式中的View对象以使用Paging选项。(即我想在我的子DataGrid中使用Paging和Grouping Options。)
  2. 期待收到你的回复。

    您好。

    我非常感谢你的善意和快速的回​​答。我按照你的说法做了,但我遇到了一个问题,希望你帮助我:

    方式:

    在我的“ ProductModelView ”(对于产品实体)中,我定义了以下对象:

    1 -private DomainCollectionView _ProductViewDCV ; (作为硕士(家长)观点)

    2 -private PagedCollectionView _ProductViewPCV ; (如细节(儿童)观点)

    3 - 在“ProductModelView”类的构造函数中,我将EVentHandler分配给“_ ProductViewDCV”(我的DomainCollectionView作为主视图):

    this._ProductViewDCV.CurrentChanged+=_ProductViewDCV_CurrentChanged;
    
    this._ProductViewDCV.Refresh();
    

    4 - 在EventHandler中,我创建一个新的“ PagedCollectionView ”(我的详细信息/子视图)并将其分配给我的_ProductViewDCV:

    if (_ProductViewDCV.CurrentItem != null)
    
    { 
    
    _ProductViewPCV = new PagedCollectionView((_ProductViewDCV.CurrentItem as BA1.Web.Product).ProductInventories);
    
    //ProductViewPCV.Refersh();
    
     }
    

    5 - 在我的查看文件(XAML文件)中,我有两个Datagrids配置如下:

    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
    

    问题:

    当我更改Master / Parent DataGrid中的当前行时,Detail / Child DataGrid中没有任何反应并测试Detail / Child DataGrid的Itemssource属性,返回“Null”,而不是“PagedCollectionview”的对象。

    我的问题在哪里以及为什么不响应Master / Parent当前项目更改而更新Detail / Child DataGrid? (测试表明,当其父集合发生变化时,ProductViewPCV本身会发生变化。)

    再次感谢您给我这个问题的建议。

1 个答案:

答案 0 :(得分:0)

在我的脑海中,我可以看到一些问题。您应该在构造函数中实例化_ProductViewPCV PagedCollectionView属性,而不是在_ProductViewDCV_CurrentChanged事件处理程序中创建它的新实例。如果您确实想这样做,那么您需要通过引发PropertyChanged事件来通知视图此_ProductViewPCV属性的值已更改。但是,您不应该这样做,因为它可能会导致内存泄漏。

你最好在PagedCollectionView中包装一个可观察的集合,我只想更新_ProductViewDCV_CurrentChanged事件处理程序中的observable集合的内容。我认为视图应该自动更新。对不起,我对此有点生疏,但我认为这对你有用。