【问题标题】:Binding off Visibility of another element - and inverting绑定另一个元素的可见性 - 并反转
【发布时间】:2011-05-05 05:43:24
【问题描述】:

如果控件 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 中是否有更直接的方法来实现这一点?我不介意有一个转换器,我只是想确保没有更好的方法我不知道。

【问题讨论】:

    标签: wpf silverlight binding


    【解决方案1】:

    归根结底,我认为你所做的没有问题。

    也就是说,如果您在 ViewModel 中有控件 A 绑定到以控制其可见性的属性,我会将控件 B 绑定到相同的属性并通过单独的转换器反转可见性。我不确定我是否可以清楚地说明原因,但这对我来说似乎更自然(至少代替您正在做的任何其他上下文)。

    【讨论】:

    • 还有更多上下文 :) 感谢您的回答。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回答。样式触发器在我看来比转换器更麻烦,但这是个人喜好问题。
    • 我同意你的看法。只是想我会发布另一种方法:)
    • 我非常喜欢这种方法,它减少了后面的代码量。
    【解决方案3】:

    你做的很好,但我更喜欢更通用的转换器,并与内置转换器保持对称。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 2016-06-28
      • 2018-06-04
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 2014-01-25
      • 2023-04-04
      相关资源
      最近更新 更多