我想将Grid的一部分的可见性绑定到ViewModel中的Property。我提出了一个解决方案,在网格中放入另一个Grid,其中包含应该折叠的控件。令人讨厌的部分是,有冗余的ColumnDefinitions:
<Grid>
<Grid.RowDefinitions>
...
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="110"/>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="140"/>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="140"/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
...
<Grid Grid.Row="4" Grid.ColumnSpan="100" Visibility="{Binding VisibilityProperty}">
<Grid.RowDefinitions>
... (some more rows)
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="110"/>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="140"/>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="140"/>
<ColumnDefinition Width="20"/>
</Grid.ColumnDefinitions>
...
</Grid>
我想到的另一个解决方案是绑定每个控件的可见性,导致绑定比上面显示的更多。
我的问题是:有没有更好的方法来隐藏网格的一部分?如果可以重用父网格的ColumnDefinitions,我特别好奇。
答案 0 :(得分:-1)
您可以使用WrapPanel
代替嵌套Grid
。您可以通过将FlowDirection
属性设置为从右到左包装控件
RightToLeft
并将Visibility
属性设置为您想要的属性。例如:
<Window x:Class="SOWpfApplication.MainWindow"
<!--The code is omitted for the brevity.-->
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="2*"/>
<RowDefinition Height="2*"/>
<RowDefinition Height="2*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="2*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Click="Button_Click" Margin="5" Grid.Row="0" Grid.ColumnSpan="2">Hide the WrapPanel</Button>
<WrapPanel Name="wrapPanel" Margin="5" Grid.Column="1" Grid.Row="1">
<TextBox Text="Hello, dude!" Margin="5"/>
<Button Content="I am the Button!" Margin="0,5,0,5"/>
<TextBlock Text="Hey, I am textBlock!"/>
</WrapPanel>
</Grid>
</Window>
要隐藏WrapPanel
,您可以使用Visibility
属性,如下所示:
private void Button_Click(object sender, RoutedEventArgs e)
{
if(wrapPanel.Visibility!= System.Windows.Visibility.Hidden)
wrapPanel.Visibility = System.Windows.Visibility.Hidden;
else
wrapPanel.Visibility = System.Windows.Visibility.Visible;
}