主/细节DataGrid。如何访问Detail DataGrid来设置ItemsSource?

时间:2011-09-01 10:54:45

标签: silverlight xaml datagrid master detail

在典型的主/细节情况下......

我有一个DataGrid。此DataGrid的ItemsSource在WCF调用的Completed事件中设置 - (grdMaster.ItemsSource = e.Result) - 其中x:网格名称为grdMaster。这都是100%。

但是,在主网格DataTemplate中添加Detail Datagrid并正确命名时...我的代码隐藏无法识别细节网格。很明显,我不能像使用grdMaster那样设置grdDetail的ItemsSource。

根据所选的主项目,我需要进行WCF调用以获取相应的详细信息。

1 个答案:

答案 0 :(得分:2)

根据您收到通知选择要扩展的项目的方式,您需要找到该用户所在的行:

DataGridRow row = DataGridRow.GetRowContainingElement(...);

并更新行详细信息可见性:

row.DetailsVisibility = Visibility.Visible;

除了这些细节之外,你需要为细节行创建一个样式 - 它连接到你可以听到的事件:

<DataTemplate x:Key="DetailsRowTemplate">
    <StackPanel>
        <Border BorderBrush="{StaticResource BlackBrush}" BorderThickness="0,2,0,0" Padding="0" >
            <data:DataGrid ItemsSource="{Binding DummyResultsView}" AutoGenerateColumns="False"
                            LoadingRow="DataGrid_LoadingRow" 
                            CanUserResizeColumns="False" 
                            CanUserReorderColumns="False"
                            HeadersVisibility="None"
                            IsReadOnly="True">
            </data:DataGrid>
        </Border>
    </StackPanel>
</DataTemplate>

设置为网格的RowDetailsTemplate:

在LoadingRow事件中,您可以获取对涉及哪个数据上下文的引用,并保存对子数据网格的引用,以便在WCF调用之后可以设置ItemsSource:

private void DataGrid_LoadingRowDetails(object sender, DataGridRowDetailsEventArgs e)
{
    List<DataGrid> detailElements = e.DetailsElement.GetChildrenByType<System.Windows.Controls.DataGrid>().ToList();

    var itemSelected = e.Row.DataContext;

    if (detailElements.Count > 0)
    {
        DataGrid detailsDataGrid = detailElements[0];

        // save a reference so the ItemsSource can be set later....
        this.DataGrid = detailsDataGrid;

        this.Model.InitializeDetailsList(detailsDataGrid, itemSelected);
    }
}

希望有所帮助,