【问题标题】:How to create a logic "OR" behavior in a MultiDataTrigger如何在 MultiDataTrigger 中创建逻辑“或”行为
【发布时间】:2018-11-23 11:37:46
【问题描述】:

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

注意

我知道我可以添加多个&lt;DataTrigger&gt;(例如在MultiDataTrigger with OR instead of AND 中),因为它们是按顺序处理的,但这正是我想要避免的。我正在寻找更多单线解决方案。

【问题讨论】:

  • @Clemens 重复的答案正是我想要避免的。这是否意味着不可能?
  • 显然,是的。
  • @Clemens 希望它真的是.. 答案是 2 岁。
  • 如果这些答案不能完全解决您的问题,请编辑此问题以解释它有何不同或提出一个新问题。 如果我最初这样做了该怎么办?
  • 碰巧我是重复答案的作者,但我对这个问题有一个较短的建议,但在我发布答案之前它已关闭。投票重新开放

标签: c# wpf xaml datatrigger


【解决方案1】:

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

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

【讨论】:

  • 不错的选择。虽然没有回答我的具体目的。谢谢! +1
【解决方案2】:

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

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

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

【讨论】:

  • 这是一个非常好的答案,值得更多关注。没有其他线程在谈论这个特定问题。真的很遗憾@Clemens 关闭了它,因为流量将大大减少。无论如何,非常感谢您的反馈!
  • @scharette,很高兴我能提供帮助。你介意我在你的问题中添加一个指向以前重复的stackoverflow.com/questions/38396419/… 的链接,以便它们显示在链接部分中,而其他有类似问题的人可以更容易地找到它们吗?
  • 我会说那将是理想的。这两个问题都是相关的,但我认为你在这里回答了一个更具体的问题。
猜你喜欢
  • 2023-02-10
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多