【问题标题】:How to binding other element in ToolTip如何在 ToolTip 中绑定其他元素
【发布时间】:2018-11-15 03:37:30
【问题描述】:

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

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

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

基本上我尝试绑定这段代码。

【问题讨论】:

  • 你有一个错字,你绑定到Txb2,但元素名称是txb2
  • WPF/UWP 和 XAML 在设计时考虑了 MVVM。虽然您可以使用其他方法,但这样做会失去大约 90% 的功能,并且每隔一段时间就会遇到问题。我不知道这是否是 MVVM,但我倾向于假设它不是。在 MVVM 中,元素表示任何 ViewModel 值都是次要细节。
  • 谢谢克里斯托弗 :) 您的建议是非常重要的信息。但我只想在这种情况下修复答案,这不是 MVVM 模式基础。

标签: c# wpf binding anchor relativesource


【解决方案1】:

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

System.Windows.Data 错误:4:找不到绑定源 参考“元素名称=txb2”。绑定表达式:路径=文本; 数据项=空;目标元素是“运行”(HashCode=58577354);目标 属性是“文本”(类型“字符串”)

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

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

<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 不起作用,因为 Tooltip 不是 Ui 属性,但 ElementName 在搜索 txb2 时仅适用于 Ui 元素层次结构(可视树)。

【讨论】:

  • 谢谢。该代码是正确的,感谢您,我找到了解决方案。 (x:参考)
【解决方案2】:

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

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

<TextBox x:Name="txb2" Text="Hello Stackoverflow" 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}}">
    ....

【讨论】:

  • 只是我只是想要解决方案。但多亏了你,我才得到了更重要的架构。终于明白了:)
猜你喜欢
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2018-08-09
  • 2021-10-12
  • 2015-11-19
  • 1970-01-01
  • 2016-06-28
相关资源
最近更新 更多