Wpf 基于多个特性设置可见性

Wpf 基于多个特性设置可见性,wpf,mvvm,Wpf,Mvvm,我有一个画布,我想根据以下两个依赖属性隐藏或显示: IsPropA IsPropB 如果其中任何一个是真的,我希望画布显示。如果两者都为假,我希望画布被隐藏 我知道我如何用一个属性就可以做到这一点。但我不确定如何处理多个属性 <Canvas Grid.Row="2" x:Name="sesimicTeam" Visibility="{Binding IsPropA}"> 您可以使用带有两个触发器的样式来实现这一点: <Canvas Grid.Row="2" x:Name=

我有一个画布,我想根据以下两个依赖属性隐藏或显示:

IsPropA
IsPropB
如果其中任何一个是真的,我希望画布显示。如果两者都为假,我希望画布被隐藏

我知道我如何用一个属性就可以做到这一点。但我不确定如何处理多个属性

<Canvas Grid.Row="2" x:Name="sesimicTeam" Visibility="{Binding IsPropA}">

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

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

您可以使用



现在,如果您的属性之一为true,它将显示您的画布

您可以使用
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类BooleanToVisibilityMultiConverter:immultivalueconverter
{
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
返回值.OfType().Any(b=>b)?Visibility.Visible:Visibility.Hidden;
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}

解决方法:创建第三个属性,并将显示画布的逻辑放在那里。是的,在本例中,这是asnwer.button丢失的材质设计颜色。使用了MultiBinding还有人想知道为什么我们不能只声明:Visibility=“{Binding IsPropA&&IsPropB}”而不是创建MultiDataTrigger吗?WPF是非常,疯狂的冗长!
<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>
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();
    }
}