如何在 ToolTip 中绑定其他元素

How to binding other element in ToolTip

我想在工具提示中绑定文本,但我有一个问题,绑定值是其他元素控件,因此我基本上无法通过绑定获得它们的值。

<TextBlock x:Name="txb2" Text="Hello Whosebug"/>

<TextBox Grid.Row="1" TextChanged="TextBox_TextChanged">
    <TextBox.ToolTip>
        <TextBlock>
            <Run Text="{Binding ElementName=txb2, Path=Text}" FontWeight="Bold"/>
        </TextBlock>
    </TextBox.ToolTip>
</TextBox>

基本上我尝试绑定此代码。

如果您查看输出,您会看到一个错误:

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=txb2'. BindingExpression:Path=Text; DataItem=null; target element is 'Run' (HashCode=58577354); target property is 'Text' (type 'String')

您可以使用x:Reference修复它:

<TextBlock x:Name="txb2" Text="Hello Whosebug"/>

<TextBox Grid.Row="1">
    <TextBox.ToolTip>
        <TextBlock>
            <Run Text="{Binding Source={x:Reference txb2}, Path=Text}" FontWeight="Bold"/>
        </TextBlock>
    </TextBox.ToolTip>
</TextBox>

至于ElementName和x:Reference的区别看下面thread。 ElementName 不起作用,因为工具提示不是 Ui 属性,但 ElementName 在搜索 txb2 时仅适用于 Ui 元素层次结构(可视化树)。

工具提示存在于可视化树之外,因此无法通过名称引用其他控件。工具提示所知道的只是它自己的 PlacementTarget——显示它的 UIElement。

允许工具提示引用其他控件的一种方法是劫持此放置目标控件的一些未使用的 属性(Tag 通常最合适),然后工具提示可以引用这些控件。

<TextBox x:Name="txb2" Text="Hello Whosebug" Width="200" />

<TextBox Grid.Row="1" Tag="{Binding ElementName=txb2}" Width="200">
    <TextBox.ToolTip>
        <ToolTip DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
            <TextBlock>
                <Run Text="{Binding Text}" FontWeight="Bold" />
            </TextBlock>
         </ToolTip>
    </TextBox.ToolTip>
</TextBox>

如果您使用的是 MVVM 设计模式,另一种方法(不需要 属性 劫持)是绑定到 PlacementTarget 的 DataContext(通常是 ViewModel)。然后,您可以将工具提示的内容绑定到您喜欢的任何 属性。

<ToolTip DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
    ....