我想通过其他内容隐藏标签的可见性,假设我有一个包含DataGrid的GroupBox:
<GroupBox>
<DataGrid x:Name="Dt">
<DataGrid.Columns>
<DataGridTextColumn Header="home" />
</DataGrid.Columns>
</DataGrid>
</GroupBox>
我想插入一个Label
,它仅在隐藏DataGrid
时出现,所以我尝试了一个简单的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
可见,标签也可见。
仅当DataGrid隐藏时,如何显示标签?
答案 0 :(得分:1)
使用Grid
面板并将Label放置在DataGrid之前。它们位于相同的网格单元中,这将确保Label在可见时被DataGrid覆盖。
<GroupBox>
<Grid>
<Label Content="Foo" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<DataGrid x:Name="Dt">
<DataGrid.Columns>
<DataGridTextColumn Header="home" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</GroupBox>
答案 1 :(得分:1)
您可以将标签的可见性默认为“隐藏”,然后在后面的代码中,当以任何调整方法隐藏了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;
}
答案 2 :(得分:1)
您可以将Style
应用于Label
,并将DataTrigger
绑定到Visibility
的{{1}}属性:
DataGrid
使用仅XAML的方法,您可以绑定到<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>
的任何属性。例如,您可以绑定到DataGrid
属性,并且仅在HasItems
为空时显示Label
。无需转换器。
答案 3 :(得分:1)
您可以将标签的可见性绑定到数据网格的可见性,并使用切换值的转换器:
<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();
}
}
答案 4 :(得分:0)
您可以使用Datagrid元素的Visibility属性,并在网格可见时将其分配给标签。标签也将可见。
<Label Content="Foo" Visibility="{Binding ElementName=Dt, Path=Visibility}" />