有一个内置的BooleanToVisibilityConverter 可用于在bool 和Visibility 之间进行转换:
<Button x:Name="button1" Content="Button 1">
<Button.Visibility>
<Binding Path="IsButton1Visible">
<Binding.Converter>
<BooleanToVisibilityConverter />
</Binding.Converter>
</Binding>
</Button.Visibility>
</Button>
您可以定义自己的反转转换器并以相同的方式绑定第二个按钮的Visibility 属性:
public class BooleanToVisibilityNegationConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
(bool)value ? Visibility.Collapsed : Visibility.Visible;
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
((Visibility)value) == Visibility.Visible ? false : true;
}
XAML:
<Button x:Name="button1" Content="Button 1">
<Button.Visibility>
<Binding Path="IsButton1Visible">
<Binding.Converter>
<local:BooleanToVisibilityNegationConverter />
</Binding.Converter>
</Binding>
</Button.Visibility>
</Button>
这不需要定义任何样式或编写任何代码隐藏,但它确实需要您定义上面的转换器类。
另一个唯一的 XAML 解决方案是为第二个按钮定义一个内联 Style。这需要零代码:
<Button x:Name="button1" Content="Button 1">
<Button.Visibility>
<Binding Path="IsButton1Visible">
<Binding.Converter>
<BooleanToVisibilityConverter />
</Binding.Converter>
</Binding>
</Button.Visibility>
</Button>
<Button x:Name="button2" Content="Button 2">
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsVisible, ElementName=button1}" Value="True">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>