如何在 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
必须是 null
和 empty
,这是没有意义的。事实上,我想要一个具有这两个值的 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; }
}
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
必须是 null
和 empty
,这是没有意义的。事实上,我想要一个具有这两个值的 OR 行为。
注意
我知道我可以添加多个 <DataTrigger>
(例如在
如果 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; }
}