【问题标题】:Nested Datagrid working嵌套数据网格工作
【发布时间】:2014-01-15 13:39:11
【问题描述】:

嗨,我使用嵌套数据网格,以下是它的定义, 这是输出的截图,

在上图中,我有 2 个数据网格。如果单击 outergrid 的任何一行,则会显示相应的 innergrid。现在,我不知道如何处理此事件并显示相应的内部网格数据。

这是我将数据网格绑定到的类结构,

class MyClass
    {
        public string Col1{ get; set; }
        public string Col2{ get; set; }
        public string Col3{ get; set; }
        public string Col4{ get; set; }
        public string Col5{ get; set; }
        public ObservableCollection<InnerObject> inner_object{ get; set; }
    }

class InnerObject
{
    public string EventName { get; set; }
    public string Date { get; set; }
    public string Time { get; set; }
    public string Message { get; set; }
    public int RIndex { get; set; }
}
<DataGrid
        x:Name="objDatagrid"
        ItemsSource="{Binding DataView}"
        CanUserAddRows="False"
        CanUserDeleteRows="False"
        AutoGenerateColumns="False"
        BorderBrush="Gray"
            >
            <DataGrid.RowStyle>
                <Style TargetType="{x:Type DataGridRow}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding TDate}" Value="">
                            <Setter Property="Visibility" Value="Collapsed"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
            <DataGrid.RowDetailsTemplate >
                <DataTemplate>


                        <DataGrid
            x:Name="objInnerDatagrid"
            IsReadOnly="True"
            ItemsSource="{Binding ElementName=objDatagrid, Path=SelectedItem.inner_object}"> 
                            <DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding Date}" Value="">
                                            <Setter Property="Visibility" Value="Collapsed"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </DataGrid.RowStyle>
                            <DataGrid.Columns>
                            </DataGrid.Columns>
                        </DataGrid>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
            <DataGrid.Columns>
                <DataGridTextColumn Header="Col1" Width="SizeToHeader" Binding="{Binding Col1}" IsReadOnly="True"/>
                <DataGridTextColumn Header="Col2" Width="80" Binding="{Binding Col2}" IsReadOnly="True"/>
                <DataGridTextColumn Header="Col3" Width="80" Binding="{Binding Col3}" IsReadOnly="True"/>
                <DataGridTextColumn Header="Col4" Width="120" Binding="{Binding Col4}" IsReadOnly="True"/>
                <DataGridTextColumn Header="Col5" Width="100" Binding="{Binding Col5}" IsReadOnly="True"/>
            </DataGrid.Columns>
        </DataGrid>

我是 WPF 的新手。谁能解释一下上面的代码及其工作原理? 这将是一个很大的帮助。 提前致谢。

【问题讨论】:

    标签: c# wpf wpfdatagrid


    【解决方案1】:

    DataGrid.RowDetailsVisibilityMode 定义何时显示详细信息行,DataGrid.RowDetailsTemplate 定义显示内容。

    默认情况下,如果定义了 RowDetailsTemplate,则会为选定的行显示行详细信息部分

    它之所以有效,是因为您将内部 DataGrid.ItemsSource 绑定到 SelectedIteminner_object - 在您的情况下为 MyClass - objDatagrid 控件

    ItemsSource="{Binding ElementName=objDatagrid, Path=SelectedItem.inner_object}">
    

    然而,这有潜在的问题。它将始终绑定到第一个选定的项目,而不是您当前打开的项目。例如,当DataGrid.RowDetailsVisibilityMode = Visible 时,所有详细信息都将指向相同的项目选择。由于每一行的DataContext(包括行详细信息)都已设置为MyClass 的实例,因此您只需:

    ItemsSource="{Binding Path=inner_object}">
    

    在内部DataGrid

    【讨论】:

    • 感谢您如此详细的解释。我只是想知道,我可以使用所有这些 RowDetailsTemplate 以编程方式创建相同的数据网格结构
    • 你的意思是“......你所要做的就是:ItemsSource="{Binding inner_object}"&gt;
    • @mcalex 是的。好眼力。谢谢你。现在已经修复了
    【解决方案2】:

    正如您在代码中已经看到的那样,RowDetailsTemplate 显示内部网格。显示行详细信息的默认行为是当有人选择父行时。

    如果您希望覆盖此行为(例如,您希望在双击时显示详细数据网格或其他内容),那么您可能需要在工作背后做一些代码......

    查看这篇文章了解更多详情...

    Show RowDetails on double-click in WPF DataGrid

    【讨论】:

    • 非常感谢。你的链接有帮助。我只是想知道,我可以使用所有这些 RowDetailsTemplate 以编程方式创建相同的数据网格结构
    猜你喜欢
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多