Свертывание строки сведений в сетке данных - PullRequest
0 голосов
/ 11 января 2019

У меня есть сетка данных со строкой данных, что-то вроде:

<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='&#709;' 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();

метод работает, но если я нажму на кнопку другой строки, ранее выбранная строка сведений останется открытой. Я проверил, правильно ли я выбрал строку, но проверил ее индекс, и она верна. Есть ли способ объединить это?

1 Ответ

0 голосов
/ 11 января 2019

Вы можете создать временную копию значения 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();
}
...