Динамически переключать видимость столбца сетки 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>

Наверху сетка заполняется некоторыми элементами управления и т.д. Теперь я хочу скрыть один столбец динамически из моего кода на С#. Я попытался достичь этого, установив ширину определения столбца равной нулю, например. Column1.Width = 0. Это работает, но мне не очень нравится это решение - нет ли лучшего способа?

Я ищу что-то вроде myGrid.Columns[0].Visibility = COLLAPSED или Column1.Visibility = HIDDEN. Я просто не могу найти что-то подобное - любые идеи?

Ответ 1

Самый простой способ сделать это - добавить именованный 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 следующим образом: вы могли бы просто добавить два элемента управления Grid, по одному в каждой строке соответствующего столбца, а затем установить Visibility из них как вместе:

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

Вы даже можете добавить Grid в каждую ячейку основного Grid и иметь полный контроль над тем, какие ячейки видны в любой момент.

Ответ 2

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

Пожалуйста, реализуйте INotifyPropertyChanged в вашей ViewModel

Ответ 3

В WPF Grid Column and Row Hiding в Project Code они показывают способ использования свойств зависимостей. Они устанавливают Visible = false, но внутренне он устанавливает Width = 0.

Другая идея - удалить определение столбца в коде позади... Но я думаю, это еще хуже взломать!: (

Ответ 4

Уродливым взломом было бы просто изменить ширину на 0 (с глаз долой, из сердца вон).

Есть много причин, почему вы не должны этого делать, но, исходя из вашей ситуации, может быть достаточно!

Ответ 5

Используйте следующую команду, чтобы скрыть сетку. Аналогичным образом вы можете скрыть определения строк и определения столбцов с помощью свойства Name.

myGrid.Visibility = System.Windows.Visibility.Hidden;