从C#代码动态切换WPF网格列的可见性

seb*_*ebi 15 c# wpf grid xaml visibility

我的问题是:我无法找到如何切换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>
Run Code Online (Sandbox Code Playgroud)

Aferwards网格中充满了一些控件等.现在我想从C#代码中动态隐藏一列.我试过通过将列的定义宽度设置为零来实现这一点,例如Column1.Width = 0.这有效,但我真的不喜欢这个解决方案 - 真的没有更好的方法吗?

我正在寻找像myGrid.Columns[0].Visibility = COLLAPSED或的东西Column1.Visibility = HIDDEN.我只是找不到那样的东西 - 任何想法?

Mor*_*kop 14

<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>
Run Code Online (Sandbox Code Playgroud)

请在您的ViewModel中实现INotifyPropertyChanged

  • @Lennart同意。这应该是公认的解决方案。 (3认同)
  • 如果要动态显示列,可以采用这种方法。 (2认同)

She*_*dan 13

最简单的方法是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>
Run Code Online (Sandbox Code Playgroud)

然后在代码后面:

GridColumn1.Visibility = Visibility.Collapsed;
Run Code Online (Sandbox Code Playgroud)

由于您的行中有多行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>
Run Code Online (Sandbox Code Playgroud)

更新>>>

没有必要Grid像这样重新排列主要...你可以轻松地添加两个Grid控件,相关列的每一行中的一个,然后将Visibility它们设置在一起:

InnerGrid1.Visibility = InnerGrid2.Visibility = Visibility.Collapsed;
Run Code Online (Sandbox Code Playgroud)

您甚至可以Grid在主要的每个单元格中添加一个,Grid并且可以完全控制在任何时候可见的单元格.


sex*_*a13 6

WPF网格列和行隐藏代码项目中,它们显示了使用依赖项属性的方法.它们设置Visible = false,但在内部,它设置Width = 0.

另一个想法是删除代码背后的列定义...但我想这是一个更糟糕的黑客!:(

  • 我尝试删除列定义本身:网格正确重新排列,但列的内容仍然存在(元素重叠)..但谢谢;) (2认同)