GDiff94
GDiff94

Reputation: 147

WPF MVVM DataGrid RowDetails with different ItemsSource

I have three DataGrids set up as individual UserControls with each ItemsSource bound to a different DependencyProperty in my ViewModel. When a row is selected in the first DataGrid, the other two populate with information relevant to the selected row. Though this works fine, I want the second and third DataGrid to be displayed in the RowDetailsTemplate of the first DataGrid.

The issue I am having is that the ItemsSource of the parent DataGrid is overriding that of the other two, so they are not populating. I have tried solutions posted on many other similar questions but none have solved my problem. My code is below, I'm hoping that I've just missed something obvious but any help would be appreciated!

Main Datagrid

<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 2 (NOTIFICATIONUserControl)

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

DataGrid 3 (GETUserControl)

<DataGrid x:Name="GetDG" 
              ItemsSource="{Binding WSEDriverGETResult}" 

Edit

Here is the code for my DependencyProperties bound to my DataGrid.

//----POST result list from WSE_DRIVER-----
    public List<WSE_DRIVER> WSEDriverList
    {
        get { return (List<WSE_DRIVER>)GetValue(WSEDriverListProperty); }
        set { SetValue(WSEDriverListProperty, value); }
    }

    public static readonly DependencyProperty WSEDriverListProperty =
        DependencyProperty.Register("WSEDriverList",
                                    typeof(List<WSE_DRIVER>),
                                    typeof(WSEAuditViewModel),
                                    new PropertyMetadata(WSEDriverListChanged_Callback));

    private static void WSEDriverListChanged_Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        WSEAuditViewModel wse_win = (WSEAuditViewModel)d;
        if (wse_win.WSEDriverList.Count > 0)
        {
            wse_win.SelectedWSEDriverPOST = wse_win.WSEDriverList.First();
        }

    }

    //----Selected POST WSE_Driver----
    public WSE_DRIVER SelectedWSEDriverPOST
    {
        get { return (WSE_DRIVER)GetValue(SelectedWSEDriverPOSTProperty); }
        set { SetValue(SelectedWSEDriverPOSTProperty, value); }
    }

    public static readonly DependencyProperty SelectedWSEDriverPOSTProperty =
        DependencyProperty.Register("SelectedWSEDriverPOST",
                                    typeof(WSE_DRIVER),
                                    typeof(WSEAuditViewModel),
                                    new PropertyMetadata(SelectedWSEDriverPOSTChanged_Callback));

    private static void SelectedWSEDriverPOSTChanged_Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
          //Gets list and assigns to WSEDriverGETResult and NotificationResult
    }



    //----GET result from WSE_Driver----
    public List<WSE_DRIVER> WSEDriverGETResult
    {
        get { return (List<WSE_DRIVER>)GetValue(WSEDriverGETResultProperty); }
        set { SetValue(WSEDriverGETResultProperty, value); }
    }

    public static readonly DependencyProperty WSEDriverGETResultProperty =
        DependencyProperty.Register("WSEDriverGETResult",
                                    typeof(List<WSE_DRIVER>),
                                    typeof(WSEAuditViewModel),
                                    new PropertyMetadata(WSEDriverGETResultChanged_Callback));

    private static void WSEDriverGETResultChanged_Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {

    }



    //----Notification Info----
    public List<SPEC_NOTIFICATION> NotificationResult
    {
        get { return (List<SPEC_NOTIFICATION>)GetValue(NotificationResultProperty); }
        set { SetValue(NotificationResultProperty, value); }
    }

    public static readonly DependencyProperty NotificationResultProperty =
        DependencyProperty.Register("NotificationResult",
                                    typeof(List<SPEC_NOTIFICATION>),
                                    typeof(WSEAuditViewModel),
                                    new UIPropertyMetadata(NotificationResultChanged_Callback));

    private static void NotificationResultChanged_Callback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
    }

Upvotes: 1

Views: 860

Answers (1)

mm8
mm8

Reputation: 169150

Since the NotificationResult and WSEDriverGETResult properties belong to the same class as the WSEDriverList property, you should be able to use a {RelativeSource} to bind to the DataContext of the parent DataGrid:

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

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

Upvotes: 1

Related Questions