如何覆盖标签可见性?



我想隐藏另一个内容的标签可见性,假设我有一个包含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;
}

您可以使用绑定到DataGridVisibility属性的DataTriggerStyle应用于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}" />

最新更新