[C#] WPF Datagrid RowDetailsTemplate visibilité liée à une propriété



Answers

En utilisant XAML pur (+ un convertisseur):

XAML:

<DataGrid.RowHeaderTemplate>
    <DataTemplate>
        <ToggleButton
            IsChecked="{Binding Path=DetailsVisibility,
                RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}},
                Converter={StaticResource _VisibilityToNullableBooleanConverter}}"
            />
    </DataTemplate>
</DataGrid.RowHeaderTemplate>

Convertisseur:

public class VisibilityToNullableBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is Visibility)
        {
            return (((Visibility)value) == Visibility.Visible);
        }
        else
        {
            return Binding.DoNothing;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool?)
        {
            return (((bool?)value) == true ? Visibility.Visible : Visibility.Collapsed);
        }
        else if (value is bool)
        {
            return (((bool)value) == true ? Visibility.Visible : Visibility.Collapsed);
        }
        else
        {
            return Binding.DoNothing;
        }
    }
}
Question

J'utilise un Datagrid WPF avec un panneau RowDetails où le RowDetailsVisibilityMode est défini sur "VisibleWhenSelected" et le SelectionMode = "Extended" afin que plusieurs lignes puissent être sélectionnées et donc afficher RowDetails, comme ci-dessous:

<dg:DataGrid x:Name="MyGrid"
             ItemsSource="{Binding Path=MyItems}"
             AutoGenerateColumns="True"
             SelectionMode="Extended"
             RowDetailsVisibilityMode="VisibleWhenSelected">

  <dg:DataGrid.RowDetailsTemplate>
    <DataTemplate>
      <TextBlock Text="Further Details..."/>
    </DataTemplate>
  </dg:DataGrid.RowDetailsTemplate>
  ...
</dg:DataGrid>

Malheureusement, pour cette application, il n'est pas intuitif d'afficher les détails des lignes sur les lignes sélectionnées, le client souhaite cocher une case sur plusieurs lignes pour afficher le volet RowDetails, mais également faire défiler la grille en sélectionnant les autres lignes. En d'autres termes, corrigez les lignes qui affichent RowDetails, peu importe ce qui se passe sur le DataGrid.

Donc, actuellement, le défilement ferme les RowDetailsPanes qu'ils ont ouverts. Ce que je voudrais faire est d'avoir une case à cocher dans l'une des colonnes et lier la visibilité du panneau RowDetails à cette propriété, mais je ne peux pas comprendre comment le faire. Le problème est simplement que RowDetailsPane ne fonctionne que sur la ou les sélection (s) de ligne dans la grille de données - peut-elle être étendue d'une manière ou d'une autre pour fonctionner sur une propriété de mon choix?

Merci d'avance, Will