【问题标题】:Set Visibility based on multiple properties根据多个属性设置可见性
【发布时间】:2014-01-16 14:31:19
【问题描述】:

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

IsPropA
IsPropB

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

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

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

【问题讨论】:

  • 解决方法:创建第三个属性并将用于显示画布的逻辑放在那里。

标签: wpf mvvm


【解决方案1】:

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

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

【讨论】:

  • 其他人想知道为什么我们不能只声明:Visibility="{Binding IsPropA && IsPropB}" 而不是创建 MultiDataTrigger? WPF 非常冗长!
【解决方案2】:

您可以使用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();
    }
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 是的,就是这样。
    • 按钮在这种情况下失去了 Material Design 颜色。使用多重绑定
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 2022-09-23
    相关资源
    最近更新 更多