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

时间:2018-06-13 19:26:09

标签: c# wpf xaml datatrigger

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 with OR instead of AND中),因为它们处理的顺序很好,但这正是我所做的。我试图避免。我正在寻找更多的单线解决方案。

2 个答案:

答案 0 :(得分:3)

如果DataTrigger应该为某个值和null工作,则可以使用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;
}

答案 1 :(得分:1)

为什么不在绑定中执行此操作

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