web-dev-qa-db-ja.com

別の要素の可視性をバインドし、反転します

コントロール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にあるかどうか疑問に思っていますか?私はコンバーターを持っていてもかまいません。私が気付いていないより良い方法がないことを確認したいだけです。

25
Adam Rackis

結論として、私はあなたがしていることに問題はないと思います。

そうは言っても、コントロールAがその可視性を制御するためにバインドするViewModelのプロパティがある場合、コントロールBを同じプロパティにバインドし、別のコンバーターを介して可視性を反転します。理由を明確にできるかどうかはわかりませんが、それは私にはもっと自然に思えます(少なくとも、あなたがしていることに関する追加のコンテキストの代わりに)。

7
Phil Sandler

この場合、トリガーを使用してそれを行うことができます。 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"/>
25
Fredrik Hedblad

あなたがしていることは問題ありませんが、私はより一般的なコンバーターを好み、組み込みのコンバーターと対称性を保つ傾向があります。

したがって、ブール値を受け入れ、可視性タイプを返すInverseBooleanToVisibiltyConverterを実行します。これは、組み込みのBoolenToVisibiltyConverterと一致します

次に、Visibilityプロパティではなく、ボタンのIsVisibleプロパティにバインドします。

しかし、それは本当に好みの問題です。

3
Brad Cunningham