У меня есть сетка данных со строкой данных, что-то вроде:
<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;
}
}
Так что это работает так: я нажимаю на кнопку, она расширяет строку сведений о выбранной строке сетки и закрывает остальные, но проблема в том, что когда я нажимаю на кнопку в открытой строке, я хочу, чтобы она свернулась, но
row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
Значение этого свойства уже свернуто, и оно снова устанавливает свойство видимым, но когда я удаляю:
CollapseGroupDetails();
метод работает, но если я нажму на кнопку другой строки, ранее выбранная строка сведений останется открытой. Я проверил, правильно ли я выбрал строку, но проверил ее индекс, и она верна. Есть ли способ объединить это?