我需要 RowDetailsTemplate 的展开/折叠

I need the Expand / Collapse for RowDetailsTemplate

提问人:Mediator 提问时间:9/30/2010 最后编辑:ΩmegaManMediator 更新时间:1/18/2023 访问量:30380

问:

我有一个.它有.单击按钮时,应展开/折叠;我该怎么做?DataGridDataGrid.RowDetailsTemplate

<Custom:DataGrid RowDetailsVisibilityMode="VisibleWhenSelected" SelectionMode="Extended" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" CanUserSortColumns="False">
    <Custom:DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <Custom:DataGrid>
                <Custom:DataGrid.Columns>
                    <Custom:DataGridTextColumn Binding="{Binding idClient, Mode=Default}" Header="Ид" IsReadOnly="True"/>
                    <Custom:DataGridTextColumn Binding="{Binding name_client, Mode=Default}"  Header="Имя" IsReadOnly="True"/>
                </Custom:DataGrid.Columns>
            </Custom:DataGrid>
        </DataTemplate>
    </Custom:DataGrid.RowDetailsTemplate>
    <Custom:DataGrid.Columns>
        <Custom:DataGridTemplateColumn>
            <Custom:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Expander IsExpanded="True"/>
                </DataTemplate>
            </Custom:DataGridTemplateColumn.CellTemplate>
        </Custom:DataGridTemplateColumn>
        <Custom:DataGridTextColumn Binding="{Binding idPartner, Mode=Default}" Header="Ид" IsReadOnly="True"/>
        <Custom:DataGridTextColumn Binding="{Binding name_partner, Mode=Default}"  Header="Имя" IsReadOnly="True"/>
    </Custom:DataGrid.Columns>
</Custom:DataGrid>
WPF 按钮 DataGrid 扩展器

评论


答:

1赞 Paul Lydon 11/26/2010 #1

在网格上选择一行时,应使用 RowDetailsTemplate 展开该行以显示内容。这将使该 Row 成为 Selected Row,并设置 DataGrid 的 SelectedIndex 属性的值。

若要折叠 Row,请将 DataGrid 的 SelectedIndex 属性设置为 -1。

1赞 Bindya 1/24/2013 #2

包括折叠和展开的事件,如下所示

   <Custom:DataGridTemplateColumn>
   <Custom:DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <Expander Collapsed="exp_Collapsed" Expanded="exp_Expanded"/>
            </DataTemplate>
        </Custom:DataGridTemplateColumn.CellTemplate>
    </Custom:DataGridTemplateColumn>

在背后的代码中

 private void exp_Collapsed(object sender, RoutedEventArgs e)
        {
            this.dataGrid1.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.Collapsed;
        }

        private void exp_Expanded(object sender, RoutedEventArgs e)
        {
            this.dataGrid1.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected;
        }

评论

1赞 ΩmegaMan 12/18/2019
选择一行的操作将打开它。通过执行对折叠的调用,无论是否选择了该行,都将折叠所有行。
37赞 penjepitkertasku 4/3/2014 #3

检查这个 ...

向 WPF DataGrid 添加按钮

XAML:

<DataGrid Name="dg1" AutoGenerateColumns="False" SelectionMode="Single" CanUserAddRows="false" CanUserDeleteRows="False" SelectionUnit="FullRow" >
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="BorderThickness" Value="0"/>
        </Style>
    </DataGrid.CellStyle>

    <DataGrid.RowHeaderTemplate>
        <DataTemplate>
            <Expander Expanded="Expander_Expanded" Collapsed="Expander_Collapsed">

            </Expander>
        </DataTemplate>
    </DataGrid.RowHeaderTemplate>

    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" IsReadOnly="True" Width="100" Binding="{Binding Name}" />
        <DataGridTextColumn Header="Title" IsReadOnly="True" Width="100" Binding="{Binding Title}" />
        <DataGridTextColumn Header="Job" IsReadOnly="True" Width="100" Binding="{Binding Job}" />
    </DataGrid.Columns>

    <DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Isi, Converter={StaticResource ResourceKey=isiTextConverter}}" Margin="10,5,0,0" />
        </DataTemplate>
    </DataGrid.RowDetailsTemplate>
</DataGrid>

MainWindow.xaml.cs

private void Expander_Expanded(object sender, RoutedEventArgs e)
{
    for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual)
    if (vis is DataGridRow)
    {
        var row = (DataGridRow)vis;
        row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
        break;
    }
}

private void Expander_Collapsed(object sender, RoutedEventArgs e)
{
    for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual)
        if (vis is DataGridRow)
        {
            var row = (DataGridRow)vis;
            row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
            break;
        }
}

输出

enter image description here

评论

4赞 ASh 5/10/2016
顺便说一句,并且是相同的。如果有意,可以有一个单一的方法来处理和事件Expander_ExpandedExpander_CollapsedExpandedCollapsed
1赞 ΩmegaMan 12/18/2019
我同意@ASh也不必在树上工作......请参阅下面的答案,其中回答/更新了这些事情。
1赞 BartoszKP 8/4/2020
此答案中缺少的是将数据网格设置为 。否则,扩展器和数据网格都会展开行。数据网格在任何行单击时都会执行此操作,而不仅仅是在单击扩展器时。RowDetailsVisibilityModeDataGridRowDetailsVisibilityMode.Collapsed
1赞 Palash Roy 8/31/2016 #4

我改进了之前的答案:

不要使用 DataGrid.RowHeaderTemplate,而是使用 DataGridTemplateColumn,如下所示:

<DataGridTemplateColumn>
   <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
                <Expander Expanded="Expander_OnExpanded"     Collapsed="Expander_OnCollapsed">
                </Expander>
           </DataTemplate>
   </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

好处是您无需在单击扩展器按钮后重新定位鼠标。

评论

0赞 ΩmegaMan 12/18/2019
不确定您所说的重新定位鼠标是什么意思。更新了下面的答案。
0赞 Palash Roy 1/23/2020
@ΩmegaMan,我的意思是扩展器按钮的位置不会改变,因此不需要向上/向下移动鼠标指针来进一步单击扩展器按钮。谢谢。
2赞 ΩmegaMan 12/18/2019 #5

与其遍历树从扩展器中查找数据网格行,不如使用 上找到的静态方法。如:GetRowContainingElementDataGridRow

private void Expander_Process(object sender, RoutedEventArgs e)
{
    if (sender is Expander expander)
    {
        var row = DataGridRow.GetRowContainingElement(expander);

        row.DetailsVisibility = expander.IsExpanded ? Visibility.Visible 
                                                    : Visibility.Collapsed;
    }
}

然后,扩展器对每个事件只有一个方法调用:

 <Expander Expanded="Expander_Process"  Collapsed="Expander_Process" />
0赞 John 1/18/2023 #6

ΩmegaMan 的答案效果很好!不要忘记添加:

 <DataGrid x:Name="DGrid" RowDetailsVisibilityMode="Collapsed"/>