我有一个WPFToolkit 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>
答案 0 :(得分:21)
检查一下......
OR
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;
}
}
<强>输出强>
答案 1 :(得分: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;
}
答案 2 :(得分:0)
在网格上选择一行应使用RowDetailsTemplate展开Row以显示内容。这使得Row成为Selected Row并设置DataGrid的SelectedIndex属性的值。
要折叠Row,请将DataGrid的SelectedIndex属性设置为-1。
答案 3 :(得分:0)
我改进了之前的答案:
使用DataGridTemplateColumn而不是使用DataGrid.RowHeaderTemplate,如下所示:
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Expander Expanded="Expander_OnExpanded" Collapsed="Expander_OnCollapsed">
</Expander>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Benifit是您在点击扩展按钮后无需重新定位鼠标。
答案 4 :(得分:0)
请使用在SpecialistRepository<Specialist> -> CustomSaveRepository<T> -> Repository<T>
上找到的静态方法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;
}
}