C# 如何覆盖标签可见性?

C# 如何覆盖标签可见性?,c#,wpf,C#,Wpf,我想通过其他内容隐藏标签可见性,假设我有一个包含DataGrid的GroupBox: <GroupBox> <DataGrid x:Name="Dt"> <DataGrid.Columns> <DataGridTextColumn Header="home" /> </DataGrid.Columns> </DataGrid> </GroupBox

我想通过其他内容隐藏标签可见性,假设我有一个包含DataGrid的GroupBox:

<GroupBox>
    <DataGrid x:Name="Dt">
        <DataGrid.Columns>
            <DataGridTextColumn Header="home" />
        </DataGrid.Columns>
    </DataGrid>
</GroupBox>
因此,我尝试在代码后面设置
DataGrid
的可见性,如:

Dt.Visibility = Visibility.Hidden;
这将隐藏
DataGrid
,但主要问题是标签,事实上,如果
Dt
可见,标签甚至是可见的


如何仅在DataGrid隐藏时显示标签?

使用
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之前。它们位于同一网格单元中,这将确保标签在可见时由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:


您可以将标签的可见性默认为“隐藏”,并且在代码隐藏中,当DataGrid以任何方法隐藏时,您可以将标签的可见性设置为“可见”

XAML:


您可以使用绑定到
DataGrid
Visibility
属性的
DataTrigger
样式
应用于
标签

<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
为空时显示
标签。不需要转换器。

您可以使用绑定到
数据网格的
可见性
属性的
数据触发器将
样式应用于
标签

<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
为空时显示
标签。不需要转换器。

您可以将标签的可见性绑定到datagrid可见性,并使用转换器切换值:


您可以将标签的可见性绑定到datagrid可见性,并使用转换器切换值:


您可以使用Datagrid元素的可见性属性,并在网格可见时指定给标签。标签也将可见

<Label Content="Foo" Visibility="{Binding ElementName=Dt, Path=Visibility}" />

您可以使用Datagrid元素的可见性属性,并在网格可见时将其指定给标签。标签也将可见

<Label Content="Foo" Visibility="{Binding ElementName=Dt, Path=Visibility}" />


您可以将标签的可见性绑定到datagrid可见性,并使用转换器切换值。您可以将标签的可见性绑定到datagrid可见性,并使用转换器切换值。
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();
    }
}
<Label Content="Foo" Visibility="{Binding ElementName=Dt, Path=Visibility}" />