具有不同ItemsSource的WPF MVVM DataGrid RowDetails

时间:2017-05-23 10:44:28

标签: wpf mvvm datagrid itemssource rowdetailstemplate

我有三个DataGrids设置为个人UserControls,每个ItemsSource绑定到DependencyProperty中的不同ViewModel。 当在第一个DataGrid中选择了一行时,其他两个填充了与所选行相关的信息。虽然这很好,但我希望第二个和第三个DataGrid显示在第一个RowDetailsTemplate的{​​{1}}中。

我遇到的问题是父DataGrid的{​​{1}}覆盖了其他两个ItemsSource,因此它们没有填充。我已尝试在许多其他类似问题上发布解决方案,但没有一个解决了我的问题。我的代码在下面,我希望我只是错过了一些明显的东西,但任何帮助都会受到赞赏!

主数据网格

DataGrid

DataGrid 2(NOTIFICATIONUserControl)

<DataGrid x:Name="PostDataGrid" 
              ItemsSource="{Binding WSEDriverList}" 
              SelectedItem="{Binding SelectedWSEDriverPOST}"
              Style="{DynamicResource MainDataGridStyle}"
              Margin="0,0,0,0"
              Grid.Row="1" >
        <DataGrid.Columns>
            <DataGridTextColumn  Header="HesId"             Binding="{Binding HESID,            Mode=OneWay}"                 Width="50"/>
            <DataGridTextColumn  Header="WseId"             Binding="{Binding WSEID,            Mode=OneWay}"                 Width="50"/>
            <DataGridTextColumn  Header="API"               Binding="{Binding API,              Mode=OneWay}"                 Width="198" />
            <DataGridTextColumn  Header="Request Date"      Binding="{Binding Path=REQUEST_DATE, Mode=OneWay, StringFormat=dd/MM/yyyy HH:mm:ss}" Width="125"/>
            <DataGridTextColumn  Header="Result Date"       Binding="{Binding Path=RESULT_DATE,  Mode=OneWay, StringFormat=dd/MM/yyyy HH:mm:ss}" Width="125"/>
            <DataGridTextColumn  Header="Return Code"       Binding="{Binding RETURN_CODE,      Mode=OneWay,  StringFormat=0}" Width="80" />
            <DataGridTextColumn  Header="Status"            Binding="{Binding STATUS,           Mode=OneWay,  StringFormat=0}" Width="70" />
        </DataGrid.Columns>
        <DataGrid.RowDetailsTemplate>
            <DataTemplate DataType="{x:Type viewmodel:WSEAuditViewModel}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Expander Header="NOTIFICATION" Grid.Row="0">
                        <ItemsControl ItemsSource="{Binding WSEDriverGETResult}">
                            <usercontrol:NOTIFICATIONUserControl/>
                        </ItemsControl>
                    </Expander>
                    <Expander Header="GET" Grid.Row="1">
                        <ItemsControl ItemsSource="{Binding WSEDriverGETResult}">
                            <usercontrol:GETUserControl/>
                        </ItemsControl>
                    </Expander>
                </Grid>
            </DataTemplate>
        </DataGrid.RowDetailsTemplate>
    </DataGrid>

DataGrid 3(GETUserControl)

<DataGrid x:Name="NotificationDG" 
              ItemsSource="{Binding NotificationResult}" 

修改

以下是绑定到<DataGrid x:Name="GetDG" ItemsSource="{Binding WSEDriverGETResult}" 的{​​{1}}的代码。

DependencyProperties

1 个答案:

答案 0 :(得分:0)

由于NotificationResultWSEDriverGETResult属性属于与WSEDriverList属性相同的类,因此您应该能够使用{RelativeSource}绑定到{{1父DataContext

DataGrid
<DataGrid x:Name="NotificationDG" ItemsSource="{Binding DataContext.NotificationResult, 
            RelativeSource={RelativeSource AncestorType=DataGrid}}"></DataGrid>