折叠数据网格中的详细信息行
Collapsing the details row in a data grid
我有一个带有详细信息行的数据网格,类似于:
<DataGrid x:Name="Applications" CanUserResizeColumns="False" CanUserResizeRows="False" RowStyle="{StaticResource CollapsedRow}" AutoGenerateColumns="false" CanUserAddRows="false" ItemsSource="{Binding Applications}">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content='˅' FontSize="9" Name="ExpanderButton" Click="OnGroupChange" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Width="181" Header="Application name" Binding="{Binding Name, Mode=OneWay}" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<!-- SOME DETAILS HERE -->
</DataGrid.RowDetailsTemplate>
</DataGrid>
现在我的想法是我有一个数据网格,其中包含额外的列和一个可以展开详细信息行的按钮,所以我的代码是:
private void OnGroupChange(object sender, RoutedEventArgs e)
{
CollapseGroupDetails();
for (var visible = (Visual)sender; visible != null; visible = VisualTreeHelper.GetParent(visible) as Visual)
{
if (visible.GetType() != typeof(DataGridRow))
continue;
var row = (DataGridRow)visible;
var appName = (ExtenedApplicationFile)row.Item;
((ApplicationsViewModel)DataContext).SelectedApplicationFile = appName;
row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
}
Applications.UpdateLayout();
}
private void CollapseGroupDetails()
{
foreach (object item in Applications.ItemsSource)
{
if (!(Applications.ItemContainerGenerator.ContainerFromItem(item) is DataGridRow row) || row.DetailsVisibility != Visibility.Visible)
continue;
row.DetailsVisibility = Visibility.Collapsed;
break;
}
}
所以它的工作方式如下:我点击一个按钮,它展开 selected 网格行的详细信息行并关闭其他行,但问题是当我点击一个打开的行上的按钮时我想让它崩溃,但是
row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
此 属性 的值已经折叠,它再次将 属性 设置为可见,但是当我删除时:
CollapseGroupDetails();
方法有效,但如果我单击另一行的按钮,之前 selected 的详细信息行将保持打开状态。我检查了我是否 select 一个正确的行,但检查了它的索引并且它是正确的。有没有办法结合起来?
您可以在设置 属性 之前创建 Visibility
值的临时副本:
private void OnGroupChange(object sender, RoutedEventArgs e)
{
DataGridRow row = null;
for (var visible = (Visual)sender; visible != null; visible = VisualTreeHelper.GetParent(visible) as Visual)
{
if (visible.GetType() != typeof(DataGridRow))
continue;
row = (DataGridRow)visible;
var appName = (ExtenedApplicationFile)row.Item;
((ApplicationsViewModel)DataContext).SelectedApplicationFile = appName;
break;
}
if (row != null)
{
Visibility currentVisibility = row.DetailsVisibility;
CollapseGroupDetails();
row.DetailsVisibility = currentVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
}
else
{
CollapseGroupDetails();
}
Applications.UpdateLayout();
}
我有一个带有详细信息行的数据网格,类似于:
<DataGrid x:Name="Applications" CanUserResizeColumns="False" CanUserResizeRows="False" RowStyle="{StaticResource CollapsedRow}" AutoGenerateColumns="false" CanUserAddRows="false" ItemsSource="{Binding Applications}">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content='˅' FontSize="9" Name="ExpanderButton" Click="OnGroupChange" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Width="181" Header="Application name" Binding="{Binding Name, Mode=OneWay}" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<!-- SOME DETAILS HERE -->
</DataGrid.RowDetailsTemplate>
</DataGrid>
现在我的想法是我有一个数据网格,其中包含额外的列和一个可以展开详细信息行的按钮,所以我的代码是:
private void OnGroupChange(object sender, RoutedEventArgs e)
{
CollapseGroupDetails();
for (var visible = (Visual)sender; visible != null; visible = VisualTreeHelper.GetParent(visible) as Visual)
{
if (visible.GetType() != typeof(DataGridRow))
continue;
var row = (DataGridRow)visible;
var appName = (ExtenedApplicationFile)row.Item;
((ApplicationsViewModel)DataContext).SelectedApplicationFile = appName;
row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
}
Applications.UpdateLayout();
}
private void CollapseGroupDetails()
{
foreach (object item in Applications.ItemsSource)
{
if (!(Applications.ItemContainerGenerator.ContainerFromItem(item) is DataGridRow row) || row.DetailsVisibility != Visibility.Visible)
continue;
row.DetailsVisibility = Visibility.Collapsed;
break;
}
}
所以它的工作方式如下:我点击一个按钮,它展开 selected 网格行的详细信息行并关闭其他行,但问题是当我点击一个打开的行上的按钮时我想让它崩溃,但是
row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
此 属性 的值已经折叠,它再次将 属性 设置为可见,但是当我删除时:
CollapseGroupDetails();
方法有效,但如果我单击另一行的按钮,之前 selected 的详细信息行将保持打开状态。我检查了我是否 select 一个正确的行,但检查了它的索引并且它是正确的。有没有办法结合起来?
您可以在设置 属性 之前创建 Visibility
值的临时副本:
private void OnGroupChange(object sender, RoutedEventArgs e)
{
DataGridRow row = null;
for (var visible = (Visual)sender; visible != null; visible = VisualTreeHelper.GetParent(visible) as Visual)
{
if (visible.GetType() != typeof(DataGridRow))
continue;
row = (DataGridRow)visible;
var appName = (ExtenedApplicationFile)row.Item;
((ApplicationsViewModel)DataContext).SelectedApplicationFile = appName;
break;
}
if (row != null)
{
Visibility currentVisibility = row.DetailsVisibility;
CollapseGroupDetails();
row.DetailsVisibility = currentVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
}
else
{
CollapseGroupDetails();
}
Applications.UpdateLayout();
}