我在网格中有一个Textblock
并且有一个ToolTip
,它应该显示"工具提示"绑定但如果是Null
或Empty
则应显示" name"结合。
如何在XAML中实现这一目标?
<TextBlock Margin="3" TextAlignment="Left" VerticalAlignment="Center" FontSize="12" Foreground="Black" HorizontalAlignment="Left" ToolTip="{Binding Tooltip}" Text="{Binding Name}"/>
答案 0 :(得分:2)
如果字符串是NULL
创建MultiValueConverter并声明为静态资源:
<local:MyConverter x:Key="MyConverter"/>
您的转换器类应如下所示:
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>
答案 1 :(得分:2)
来自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>
其中A绑定在以下情况下成功返回值:
绑定源的路径成功解析。
值转换器(如果有)能够转换结果值。
结果值对目标属性有效。
使用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;
答案 2 :(得分:2)
只有当ImageView
source属性返回时,您才能使用Style
一个或两个DataTriggers
将ToolTip
属性绑定到Name
source属性Tooltip
或emtpy null
:
string
答案 3 :(得分:1)
我通过使用TooltipOpening使用如下方法实现了这一点: -
<TextBlock Margin="3" TextAlignment="Left" VerticalAlignment="Center" FontSize="12" Foreground="Black" HorizontalAlignment="Left" ToolTip="" ToolTipOpening="TextBlock_ToolTipOpening" Text="{Binding Name}" TextWrapping="Wrap" MaxWidth="470" />
然后在&#34; TextBlock_ToolTipOpening&#34;方法我按如下方式应用了我的支票: -
if (!String.IsNullOrEmpty(stf.Tooltip))
{
t.ToolTip = stf.Tooltip;
}
else
{
t.ToolTip = stf.Name;
}
它按预期工作 - 感谢所有人的贡献......如果没有你的帮助,我们就无法解决这个问题。