我想隐藏另一个内容的标签可见性,假设我有一个包含DataGrid的GroupBox:
<GroupBox>
<DataGrid x:Name="Dt">
<DataGrid.Columns>
<DataGridTextColumn Header="home" />
</DataGrid.Columns>
</DataGrid>
</GroupBox>
我想插入一个仅在隐藏DataGrid
时才出现的Label
,所以我尝试了一个简单的StackPanel
:
<GroupBox>
<StackPanel Orientation="Vertical">
<DataGrid x:Name="Dt">
<DataGrid.Columns>
<DataGridTextColumn Header="home" />
</DataGrid.Columns>
</DataGrid>
<Label Content="Foo" />
</StackPanel>
</GroupBox>
所以我尝试设置代码背后DataGrid
的可见性,例如:
Dt.Visibility = Visibility.Hidden;
这将隐藏DataGrid
但主要问题是标签,事实上标签甚至是可见的,如果Dt
是可见的。
如何仅在隐藏数据网格时显示标签?
使用Grid
面板并将标签放在DataGrid之前。它们位于同一网格单元格中,这将确保标签在可见时被 DataGrid 覆盖。
<GroupBox>
<Grid>
<Label Content="Foo" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<DataGrid x:Name="Dt">
<DataGrid.Columns>
<DataGridTextColumn Header="home" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</GroupBox>
您可以将标签的可见性默认为"隐藏",并且在代码隐藏中,当 DataGrid 以任何方法隐藏时,您可以将标签的可见性设置为可见
XAML:
<GroupBox>
<StackPanel Orientation="Vertical">
<DataGrid x:Name="Dt">
<DataGrid.Columns>
<DataGridTextColumn Header="home" />
</DataGrid.Columns>
</DataGrid>
<Label Content="Foo" Visibility="Hidden" x:Name="fooLabel" />
</StackPanel>
</GroupBox>
代码隐藏:
private void yourMethod(object sender, RoutedEventArgs e)
{
Dt.Visibility = Visibility.Hidden;
fooLabel.Visibility = Visibility.Visible;
}
您可以使用绑定到DataGrid
的Visibility
属性的DataTrigger
将Style
应用于Label
:
<GroupBox>
<StackPanel Orientation="Vertical">
<DataGrid x:Name="Dt" Visibility="Collapsed">
<DataGrid.Columns>
<DataGridTextColumn Header="home" />
</DataGrid.Columns>
</DataGrid>
<Label Content="Foo">
<Label.Style>
<Style TargetType="Label">
<Style.Triggers>
<DataTrigger Binding="{Binding Visibility, ElementName=Dt}" Value="Visible">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
</StackPanel>
</GroupBox>
使用此仅限 XAML 的方法,可以绑定到DataGrid
的任何属性。例如,您可以绑定到HasItems
属性,并且仅在DataGrid
为空时显示Label
。无需转换器。
您可以将标签的可见性绑定到 datagrid 可见性,并使用切换值的转换器:
<GroupBox>
<StackPanel Orientation="Vertical">
<StackPanel.Resources>
<local:VisibilityInverter x:key="VisInverter"/>
</StackPanel.Resources>
<DataGrid x:Name="Dt">
<DataGrid.Columns>
<DataGridTextColumn Header="home" />
</DataGrid.Columns>
</DataGrid>
<Label Content="Foo" Visibility="{Binding Path=Visibility, ElementName=Dt, Converter={StaticResource VisInverter}}" />
</StackPanel>
</GroupBox>
这里的转换器:
public class VisibilityInverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return Visibility.Hidden;
if (value == Visibility.Visible)
return Visibility.Hidden;
return Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, ultureInfo culture)
{
throw new NotImplementedException();
}
}
可以使用 Datagrid 元素的 可见性 属性,并在网格可见时分配给标签 标签也将可见。
<Label Content="Foo" Visibility="{Binding ElementName=Dt, Path=Visibility}" />