绑定另一个元素的可见性 - 并反转

时间:2010-11-04 18:30:36

标签: wpf silverlight binding

如果控件B被隐藏,我想让Control A可见,反之亦然。现在我有这个转换器:

public class InvertVisibilityConverter : IValueConverter {

    public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture) {
        if (targetType == typeof(Visibility)) {
            Visibility vis = (Visibility)value;
            return vis == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
        }
        throw new InvalidOperationException("Converter can only convert to value of type Visibility.");
    }

    public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture) {
        throw new Exception("Invalid call - one way only");
    }
}

这个XAML:

<Button Visibility="{Binding ElementName=btn1, Path=Visibility, Converter={StaticResource InvertVisibilityConverter}}">Btn2</Button>

哪个有效。我只是想知道在WPF / Silverlight中是否有更直接的方法来实现这一目标?我不介意有转换器,我只是想确保没有更好的方法我不知道。

3 个答案:

答案 0 :(得分:23)

在这种情况下,您可以使用触发器来完成。带两个按钮的示例

<Button Name="button1">
    <Button.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=button2, Path=Visibility}" Value="Visible">
                    <Setter Property="Button.Visibility" Value="Hidden"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>
<Button Name="button2"/>

答案 1 :(得分:6)

最重要的是,我认为你正在做的事情没有问题。

也就是说,如果控件A绑定的ViewModel中有一个属性来控制其可见性,我会将Control B绑定到同一属性并通过单独的转换器反转visibily。我不确定我能说清楚原因,但这对我来说似乎更自然(至少代替你正在做的任何其他背景)。

答案 2 :(得分:3)

你做得很好,但我倾向于选择更通用的转换器,并保持与内置转换器的对称性。

所以我会做一个接受布尔值并返回可见性类型的InverseBooleanToVisibiltyConverter。这与内置的BoolenToVisibiltyConverter

相匹配

然后我将绑定到按钮的IsVisible属性而不是Visibility属性。

但这确实是一个偏好问题。