web-dev-qa-db-ja.com

C#コードからWPFグリッド列の表示を動的に切り替える

私の問題は、WPFグリッド列の表示/非表示を切り替える方法が見つからないことです。次の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>

グリッドはいくつかのコントロールなどで満たされています。次に、C#コードから動的に1つの列を非表示にします。列の定義幅をゼロに設定して、これを達成しようとしました。 Column1.Width = 0。これは機能しますが、私はこのソリューションが本当に好きではありません-本当に良い方法はありませんか?

myGrid.Columns[0].Visibility = COLLAPSEDColumn1.Visibility = HIDDENのようなものを探しています。私はそのようなものを見つけることができません-アイデアはありますか?

14
sebi

これを行う最も簡単な方法は、非表示にする関連列のトップレベルコントロールとして名前付きGridを追加することです。次に、他のコントロールと同じように、それとそのすべてのコンテンツを非表示にすることができます。

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>

次に、コードビハインドで:

GridColumn1.Visibility = Visibility.Collapsed;

Gridに複数の行があるため、次のように並べ替えることができます。

<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>

更新>>>

メインのGridをこのように再配置する必要はありません...関連する列の各行に1つずつ、2つのGridコントロールを同様に簡単に追加して could を設定し、その後Visibilityそれらを一緒に:

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

メインのGridの各セルにGridを追加して、どのセルをいつでも表示できるかを完全に制御することもできます。

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>

ViewModelにINotifyPropertyChangedを実装してください

13
Morlo Mbakop

コードプロジェクトの WPFグリッド列と行の非表示 では、依存関係プロパティを使用する方法を示しています。それらはVisible = falseが、内部的にはWidth = 0

別のアイデアは、コードビハインドの列定義を削除することです...しかし、それはさらに悪いハックだと思います! :(

6
sexta13

いハックは、幅を0に変更することです(見えない、気にしない)。

これを行うべきではない理由はたくさんありますが、状況によってはそれで十分かもしれません!

3
Dave