提问人:Mediator 提问时间:9/30/2010 最后编辑:ΩmegaManMediator 更新时间:1/18/2023 访问量:30380
我需要 RowDetailsTemplate 的展开/折叠
I need the Expand / Collapse for RowDetailsTemplate
问:
我有一个.它有.单击按钮时,应展开/折叠;我该怎么做?DataGrid
DataGrid.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>
答:
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
检查这个 ...
或
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;
}
}
输出
评论
4赞
ASh
5/10/2016
顺便说一句,并且是相同的。如果有意,可以有一个单一的方法来处理和事件Expander_Expanded
Expander_Collapsed
Expanded
Collapsed
1赞
ΩmegaMan
12/18/2019
我同意@ASh也不必在树上工作......请参阅下面的答案,其中回答/更新了这些事情。
1赞
BartoszKP
8/4/2020
此答案中缺少的是将数据网格设置为 。否则,扩展器和数据网格都会展开行。数据网格在任何行单击时都会执行此操作,而不仅仅是在单击扩展器时。RowDetailsVisibilityMode
DataGridRowDetailsVisibilityMode.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
与其遍历树从扩展器中查找数据网格行,不如使用 上找到的静态方法。如:GetRowContainingElement
DataGridRow
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"/>
评论