根据多个属性设置可见性

25

我有一个Canvas,我希望基于两个依赖属性来隐藏或显示它:

IsPropA
IsPropB
如果其中任何一个条件为真,我希望Canvas显示。如果两个条件都为假,我想隐藏Canvas。
我知道如何使用一个属性来实现它。但是我不确定如何使用多个属性来实现它。
<Canvas Grid.Row="2" x:Name="sesimicTeam" Visibility="{Binding IsPropA}">

解决方法:创建第三个属性,并将显示画布的逻辑放在那里。 - Eugene
3个回答

44

你可以使用MultiDataTrigger

<Canvas Grid.Row="2" x:Name="sesimicTeam">
    <Canvas.Style>
        <Style>
            <Setter Property="Control.Visibility" Value="Visible" />
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding Path=IsPropA}" Value="false" />
                        <Condition Binding="{Binding Path=IsPropB}" Value="false" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Control.Visibility" Value="Hidden" />
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </Canvas.Style>
</Canvas>

如果你的属性中有一个为真,现在它将显示你的画布。


16
还有其他人也在想为什么我们不能直接声明:Visibility="{Binding IsPropA && IsPropB}" 而不用创建MultiDataTrigger吗?WPF非常冗长啊! - nanonerd

28

您可以使用 IMultiValueConverter 来实现此功能。该接口接受任意数量的绑定并返回单个值。

XAML

<Canvas>
    <Canvas.Resources>
        <converter:BooleanToVisibilityMultiConverter x:Key="BooleanToVisibilityMultiConverter" />
    </Canvas.Resources>
    <Canvas.Visibility>
        <MultiBinding Converter="{StaticResource BooleanToVisibilityMultiConverter}">
            <Binding Path="IsPropA" />
            <Binding Path="IsPropB" />
        </MultiBinding>
    </Canvas.Visibility>
</Canvas>

C#

public class BooleanToVisibilityMultiConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values.OfType<bool>().Any(b => b) ? Visibility.Visible : Visibility.Hidden;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

10

您可以使用带有两个触发器的样式来实现这一点:

 <Canvas Grid.Row="2" x:Name="sesimicTeam">
        <Canvas.Style>
            <Style TargetType="Canvas">
                <Setter Property="Visibility" Value="Collapsed"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsPropA}" Value="True">
                        <Setter Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding IsPropB}" Value="True">
                        <Setter Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Canvas.Style>
    </Canvas>

是的,那就是答案。 - webdad3
在这种情况下,按钮失去了Material Design颜色。使用了MultiBinding。 - Volodymyr Kotylo

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