我有一个网格中的Textblock和一个应该显示“工具提示”绑定的ToolTip,但如果它是Null或Empty,它应该显示“名称”绑定。
如何在XAML中实现这一点?
<TextBlock Margin="3" TextAlignment="Left" VerticalAlignment="Center" FontSize="12" Foreground="Black" HorizontalAlignment="Left" ToolTip="{Binding Tooltip}" Text="{Binding Name}"/>
发布于 2017-04-28 16:42:19
如果字符串为NULL
创建MultiValueConverter并声明为静态资源:
<local:MyConverter x:Key="MyConverter"/>您的Converter类应该如下所示:
public class MyConverter: IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string tooltip = values.ElementAtOrDefault(0) as string,
name = values.ElementAtOrDefault(1) as string;
if(!String.IsNullOrEmpty(tooltip))
return tooltip;
else
return name;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}和你的TextBlock:
<TextBlock FontSize="12" Foreground="Red" Text="{Binding MyName}">
<TextBlock.ToolTip>
<MultiBinding Converter="{StaticResource NameConverter}">
<Binding Path="Tooltip" IsAsync="True"/>
<Binding Path="MyName"/>
</MultiBinding>
</TextBlock.ToolTip>
</TextBlock>发布于 2017-04-28 17:11:45
来自MSDN
Windows Presentation Foundation (WPF)中的PriorityBinding通过指定绑定列表来工作。绑定列表从最高优先级到最低优先级排序。如果在处理最高优先级绑定时成功返回值,则永远不需要处理列表中的其他绑定。可能的情况是,最高优先级绑定需要很长时间来评估,成功返回值的下一个最高优先级将被使用,直到更高优先级的绑定成功返回值。
一个示例如下所示
<StackPanel>
<ToggleButton IsChecked="{Binding ShowTooltip, Mode=TwoWay}" >toggle</ToggleButton>
<TextBlock>
<TextBlock.ToolTip>
<PriorityBinding>
<Binding Path="ToolTipSometimes" Mode="OneWay"/>
<Binding Path="Name" Mode="OneWay"/>
</PriorityBinding>
</TextBlock.ToolTip>
</TextBlock>
</StackPanel>如果满足以下条件,则绑定成功返回值:
使用MultiBinding可以像这样完成
<TextBlock >
<TextBlock.ToolTip>
<MultiBinding>
<MultiBinding.Converter>
<local:NullCleanup/>
</MultiBinding.Converter>
<Binding Path="ToolTip" Mode="OneWay"/>
<Binding Path="Text" Mode="OneWay" />
</MultiBinding>
</TextBlock.ToolTip>
</TextBlock>以此作为转换器
public class NullCleanup : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.Aggregate((r, o) => r ?? o);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}但是,您可以将逻辑放入您的VM中
private string _Tooltip;
public string Tooltip;
{
get { return _Tooltip; }
set { SetProperty(ref _Tooltip, value,()=>RaisePropertyChanged(nameof(ToolTipCleaned))); }
}
public string ToolTipCleaned => Tooltip ?? Name;发布于 2017-04-28 17:46:55
您可以使用具有一个或两个DataTriggers的Style,仅当Tooltip源属性返回null或Name string时,才能将Tooltip属性绑定到emtpy源属性
<TextBlock Margin="3" TextAlignment="Left" VerticalAlignment="Center" FontSize="12" Foreground="Black" HorizontalAlignment="Left"
Text="{Binding Name}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="ToolTip" Value="{Binding Tooltip}" />
<Style.Triggers>
<DataTrigger Binding="{Binding Tooltip}" Value="{x:Null}">
<Setter Property="ToolTip" Value="{Binding Name}" />
</DataTrigger>
<DataTrigger Binding="{Binding Tooltip}" Value="">
<Setter Property="ToolTip" Value="{Binding Name}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>https://stackoverflow.com/questions/43675418
复制相似问题