如何在 MultiDataTrigger 中创建逻辑 "OR" 行为

How to create a logic "OR" behavior in a 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>(例如在 中),因为它们是按顺序处理的,所以没问题,但这正是我要避免的.我正在寻找 one-liner 解决方案。

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

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>

也可以专门为 empty/null 字符串制作一个可见性转换器并且在没有触发器的情况下工作:

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

为什么不直接在你的绑定中做呢

private string userName;
public string UserName 
{
    get { return string.IsNullOrEmpty(userName) ? null : userName; }
    set { userName = value; }
}