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

27

如果控件B隐藏,则我希望使控件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个回答

33

在这种情况下,你可以使用触发器来实现。以下是两个按钮的示例:

<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"/>

2
谢谢你的回答。对我来说,样式触发器似乎比转换器更繁琐,但这只是个人偏好的问题。 - Adam Rackis
我同意你的观点。只是想发表另一种实现方式 :) - Fredrik Hedblad
我非常喜欢这个方法,它减少了后面的代码量。 - Stan1k

10

总之,我认为你所做的没有问题。

但是,如果在ViewModel中有一个属性用于绑定Control A的可见性控制,则我会将Control B绑定到相同的属性,并通过单独的转换器来反转可见性。我不确定是否能表达清楚原因,但在缺乏其他上下文信息的情况下,这似乎更自然。


谢谢你的回答,有更多的上下文 :) - Adam Rackis

3
你做的很好,但我更喜欢更通用的转换器,并保持与内置转换器的对称性。
因此,我会创建一个InverseBooleanToVisibiltyConverter,接受布尔值并返回可见性类型。这与内置的BoolenToVisibiltyConverter相匹配。
然后,我将绑定到按钮的IsVisible属性,而不是Visibility属性。
但这只是个人喜好的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接