首页 > 解决方案 > 如何在 MultiDataTrigger 中创建逻辑“或”行为

问题描述

XAML

<TextBlock FontSize="14" Foreground="Red">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <!--Here I want to compare with an OR behavior-->
                        <Condition Binding="{Binding Username}" Value="" />
                        <Condition Binding="{Binding Username}" Value="{x:Null}"/>
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Text" Value="No Username"/>
                    <Setter Property="Visibility" Value="Visible"/>
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

要触发这个,必须Username是这样nullempty这没有任何意义。事实上,我想要一个具有这两个值的 OR 行为

笔记

我知道我可以添加多个<DataTrigger>(例如在MultiDataTrigger 中使用 OR 而不是 AND)并且因为它们是按顺序处理的,但这正是我想要避免的。我正在寻找更多的单线解决方案。

标签: c#wpfxamldatatrigger

解决方案


如果 DataTrigger 应该为某个值和 工作null,您可以使用Binding 的属性替换null该值。TargetNullValue

TargetNullValue=''替换null为空字符串。

<TextBlock FontSize="14" Foreground="Red">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Username, TargetNullValue=''}" Value="">
                    <Setter Property="Text" Value="No Username"/>
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

也可以专门为空/空字符串制作可见性转换器,并且无需触发器即可工作:

<TextBlock FontSize="14" Foreground="Red" Text="No Username"
           Visibility="{Binding Username, Converter={StaticResource MyStringToVisibiltyConverter}}"/>

其中 Convert 方法将类似于:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    var str = value as string;
    return String.IsNullOrEmpty(str) ? Visibility.Visible : Visibility.Collapsed;
}

推荐阅读