WPF工具提示是有条件的

时间:2017-04-28 08:20:17

标签: wpf binding tooltip

我在网格中有一个Textblock并且有一个ToolTip,它应该显示"工具提示"绑定但如果是NullEmpty则应显示" name"结合。

如何在XAML中实现这一目标?

<TextBlock Margin="3" TextAlignment="Left" VerticalAlignment="Center" FontSize="12" Foreground="Black" HorizontalAlignment="Left" ToolTip="{Binding Tooltip}" Text="{Binding Name}"/>

4 个答案:

答案 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一个或两个DataTriggersToolTip属性绑定到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;
    }

它按预期工作 - 感谢所有人的贡献......如果没有你的帮助,我们就无法解决这个问题。