wpf 根据多个属性设置可见性

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21164587/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-09 00:03:16  来源:igfitidea点击:

Set Visibility based on multiple properties

wpfmvvm

提问by webdad3

I have a Canvas that I want to hide or show based off of 2 dependency properties:

我有一个 Canvas,我想根据 2 个依赖项属性隐藏或显示它:

IsPropA
IsPropB

If either of these are true I want the Canvas to display. If both are false I want the Canvas to be hidden.

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

I know how I can do it with just 1 property. But I'm unsure of how to do it with multiple properties.

我知道如何只用 1 个属性就可以做到这一点。但我不确定如何使用多个属性来做到这一点。

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

回答by WiiMaxx

you could use MultiDataTrigger

你可以使用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>

now it will show your Canvas if one of your Properties is true

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

回答by Kevin Kalitowski

You can do this with a IMultiValueConverter. That interface accepts any number of bindings and returns a single value.

您可以使用IMultiValueConverter. 该接口接受任意数量的绑定并返回单个值。

XAML

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#

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();
    }
}

回答by Novitchi S

You can achieve this using a style with two triggers:

您可以使用带有两个触发器的样式来实现此目的:

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