web-dev-qa-db-fra.com

Basculer dynamiquement la visibilité de la colonne de grille WPF à partir du code C #

Mon problème est: je ne peux pas savoir comment basculer la visibilité de ma colonne de grille WPF. Supposons que le balisage XAML suivant:

<Grid x:Name="myGrid">
    <Grid.RowDefinitions>
        <RowDefinition x:Name="Row1" />
        <RowDefinition x:Name="Row2" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="Column1" />
        <ColumnDefinition x:Name="Column2" />
    </Grid.ColumnDefinitions>
</Grid>

Après la grille est remplie de quelques contrôles, etc. Maintenant, je veux masquer dynamiquement une seule colonne de mon code C #. J'ai essayé d'y parvenir en définissant la largeur de définition de la colonne à zéro, par exemple Column1.Width = 0. Cela fonctionne, mais je n'aime pas vraiment cette solution - n'y a-t-il vraiment pas de meilleur moyen?

Je cherche quelque chose comme myGrid.Columns[0].Visibility = COLLAPSED ou Column1.Visibility = HIDDEN. Je ne peux pas trouver quelque chose comme ça - des idées?

18
sebi

La façon la plus simple de procéder consiste à ajouter un Grid nommé en tant que contrôle de niveau supérieur dans la colonne appropriée que vous souhaitez masquer. Ensuite, vous pouvez simplement le cacher et tout son contenu comme vous le feriez pour tout autre contrôle:

En XAML:

<Grid x:Name="myGrid">
    <Grid.RowDefinitions>
        <RowDefinition x:Name="Row1" />
        <RowDefinition x:Name="Row2" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="Column1" />
        <ColumnDefinition x:Name="Column2" />
    </Grid.ColumnDefinitions>
    <Grid x:Name="GridColumn1" Grid.Column="1">
        ...
    </Grid>
</Grid>

Puis en code derrière:

GridColumn1.Visibility = Visibility.Collapsed;

Comme vous avez plusieurs lignes dans votre Grid, vous pouvez les réorganiser comme ceci:

<Grid x:Name="myGrid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="Column1" />
        <ColumnDefinition x:Name="Column2" />
    </Grid.ColumnDefinitions>
    <Grid x:Name="GridColumn0" Grid.Column="0">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
    </Grid>
    <Grid x:Name="GridColumn1" Grid.Column="1">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
    </Grid>
</Grid>

MISE À JOUR >>>

Il n'est pas vraiment nécessaire de réorganiser le Grid principal comme ceci ... vous pourriez tout aussi facilement ajouter deux contrôles Grid, un dans chaque ligne de la colonne appropriée puis définissez le Visibility des deux ensemble:

InnerGrid1.Visibility = InnerGrid2.Visibility = Visibility.Collapsed;

Vous pouvez même ajouter un Grid dans chaque cellule du Grid principal et avoir un contrôle total sur les cellules visibles à tout moment.

13
Sheridan
<ColumnDefinition>
  <ColumnDefinition.Style>
    <Style TargetType="ColumnDefinition">
      <Setter Property="Width" Value="*" />
        <Style.Triggers>
          <DataTrigger Binding="{Binding IsColumnVisible}" Value="False">
            <Setter Property="Width" Value="0" />
          </DataTrigger>
        </Style.Triggers>
    </Style>
  </ColumnDefinition.Style>
</ColumnDefinition>

Veuillez implémenter INotifyPropertyChanged dans votre ViewModel

13
Morlo Mbakop

Dans WPF Grid Column and Row Hiding sur Code Project, ils montrent un moyen d'utiliser les propriétés de dépendance. Ils ont mis Visible = false, mais en interne, il définit Width = 0.

Une autre idée est de supprimer la définition de colonne dans le code derrière ... Mais je suppose que c'est un piratage encore pire! :(

6
sexta13

Un hack laid serait de simplement changer la largeur à 0 (hors de vue, hors de l'esprit).

Il y a plusieurs raisons pour lesquelles vous ne devriez pas faire cela mais, selon votre situation, cela peut suffire!

3
Dave