首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WPF工具提示条件

WPF工具提示条件
EN

Stack Overflow用户
提问于 2017-04-28 16:20:17
回答 4查看 1.8K关注 0票数 3

我有一个网格中的Textblock和一个应该显示“工具提示”绑定的ToolTip,但如果它是NullEmpty,它应该显示“名称”绑定。

如何在XAML中实现这一点?

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

EN

回答 4

Stack Overflow用户

发布于 2017-04-28 16:42:19

如果字符串为NULL

创建MultiValueConverter并声明为静态资源:

代码语言:javascript
复制
<local:MyConverter x:Key="MyConverter"/>

您的Converter类应该如下所示:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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>
票数 2
EN

Stack Overflow用户

发布于 2017-04-28 17:11:45

来自MSDN

Windows Presentation Foundation (WPF)中的PriorityBinding通过指定绑定列表来工作。绑定列表从最高优先级到最低优先级排序。如果在处理最高优先级绑定时成功返回值,则永远不需要处理列表中的其他绑定。可能的情况是,最高优先级绑定需要很长时间来评估,成功返回值的下一个最高优先级将被使用,直到更高优先级的绑定成功返回值。

一个示例如下所示

代码语言:javascript
复制
<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>

如果满足以下条件,则绑定成功返回值:

  • 绑定源的路径解析successfully.
  • The值转换器(如果有)能够转换结果值。
  • 结果值对
  • 属性有效。

使用MultiBinding可以像这样完成

代码语言:javascript
复制
<TextBlock >
    <TextBlock.ToolTip>
        <MultiBinding>
            <MultiBinding.Converter>
                <local:NullCleanup/>
            </MultiBinding.Converter>
            <Binding Path="ToolTip" Mode="OneWay"/>
            <Binding Path="Text" Mode="OneWay" />
        </MultiBinding>
    </TextBlock.ToolTip>
</TextBlock>

以此作为转换器

代码语言:javascript
复制
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中

代码语言:javascript
复制
    private string _Tooltip;

    public string Tooltip;
    {
        get { return _Tooltip; }
        set { SetProperty(ref _Tooltip, value,()=>RaisePropertyChanged(nameof(ToolTipCleaned))); }
    }

    public string ToolTipCleaned => Tooltip ?? Name;
票数 2
EN

Stack Overflow用户

发布于 2017-04-28 17:46:55

您可以使用具有一个或两个DataTriggersStyle,仅当Tooltip源属性返回nullName string时,才能将Tooltip属性绑定到emtpy源属性

代码语言:javascript
复制
<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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43675418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档