具有不同 ItemsSource 的 WPF MVVM DataGrid RowDetails

标签 wpf mvvm datagrid itemssource rowdetailstemplate

我有三个 DataGrids设置为个人UserControls每个 ItemsSource绑定(bind)到不同的DependencyProperty在我的ViewModel .
当在第一个 DataGrid 中选择一行时,另外两个填充与所选行相关的信息。虽然这很好用,但我想要第二个和第三个 DataGrid显示在RowDetailsTemplate第一个 DataGrid .

我遇到的问题是 ItemsSource parent 的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(通知用户控件)
<DataGrid x:Name="NotificationDG" 
              ItemsSource="{Binding NotificationResult}" 

数据网格 3 (GETUserControl)
<DataGrid x:Name="GetDG" 
              ItemsSource="{Binding WSEDriverGETResult}" 

编辑

这是我的 DependencyProperties 的代码绑定(bind)到我的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)
    {
    }

最佳答案

由于NotificationResultWSEDriverGETResult属性与 WSEDriverList 属于同一类属性,您应该可以使用 {RelativeSource}绑定(bind)到 DataContext 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>

关于具有不同 ItemsSource 的 WPF MVVM DataGrid RowDetails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44132577/

相关文章:

wpf - 与 WPF MVVM Unity、Generic Repository 作斗争

wpf - 使用自定义控件而不是用户控件来创建复杂的 View

c# - 使用 MVVM 单击 DataGrid 单个单元格行和列

c# - 创建 SQLite 表 Xamarin 表单

如果选择了数据网格行,则 WPF MVVM Light 启用按钮

c# - 处理 DataGrid.ScrollIntoView View 模型中的选择更改

c# - 来自 System.Windows.Forms 的 AccessViolationException,在 WPF 中使用 WinFormsHost

wpf - DataGrid , TextBox - 绑定(bind)和即时更新

c# - 在命令 shell 中退出 WPF 应用程序

wpf - mvvm 中的数据验证