【问题标题】:How to access the parent class inside a resource如何访问资源中的父类
【发布时间】:2011-06-13 09:00:31
【问题描述】:

我正在尝试创建一个复杂的工具提示,其中一个 TextBlock 将绑定到 UserControl 的属性,在该属性中,此工具提示被定义为资源。 XAML 代码的简化版本如下所示:

<UserControl x:Class="WpfApplication3.TestPage"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         xmlns:pixellab="clr-namespace:PixelLab.Wpf;assembly=UIControls"
         xmlns:my="clr-namespace:WpfApplication3"
         d:DesignHeight="499" d:DesignWidth="409"
         x:Name="PageInstance" >
<UserControl.Resources>
    <Grid x:Key="Tooltip">
        <TextBlock Text="{Binding ElementName=PageInstance, Path=PageTest}"/>
    </Grid>
</UserControl.Resources>
<Border Background="Red" ToolTip="{StaticResource Tooltip}" />

UserControl 被命名为 PageInstance。显示在里面的边框有一个定义为资源的工具提示。如果我尝试将文本与

绑定
<TextBlock Text="{Binding ElementName=PageInstance, Path=PageTest}"/>

我在运行应用程序时遇到绑定错误:

System.Windows.Data 错误:4:找不到与引用“ElementName=PageInstance”进行绑定的源。绑定表达式:路径=页面测试;数据项=空;目标元素是'TextBlock'(名称='');目标属性是“文本”(类型“字符串”)

如何才能成功地将文本绑定到 PageInstance 用户控件中的 PageTest 属性?

感谢您的帮助。我还没有完全弄清楚绑定是如何工作的。 格雷戈尔

【问题讨论】:

    标签: wpf data-binding binding resources


    【解决方案1】:

    在绑定中使用RelativeSource,如下所示:

    <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=PageTest}"/>
    

    【讨论】:

    • 谢谢,这里的竞争与 C# 标签之类的东西相比简直是微不足道:P
    • 感谢您的回答,但不幸的是它们对我不起作用。我不能使用DataContext,因为在我的真实代码中我没有在Border而是在ListBoxItem上设置这个ToolTip,我需要使用该项目的DataContext(工具提示中的一些项目绑定到那个)..我设置了已经有的工具提示我需要使用的 DataContext 集。绑定到祖先也对我不起作用,因为我仍然遇到同样的错误。还有其他选择吗?
    • 这很奇怪,RelativeSource 绑定理论上应该可以工作,除了我现在想不出其他任何东西......(除了在代码隐藏中设置绑定,如果那样的话是一种选择?)
    • 谢谢。我完全忘记了我可以在后面的代码中设置绑定。这对我来说非常有用,谢谢!
    【解决方案2】:

    Border 将继承UserControlDataContext。因此,修改您的工具提示...

    <Grid x:Key="Tooltip">
        <TextBlock Text="{Binding PageTest}"/>
    </Grid>
    

    ...然后在您的UserControl 上设置DataContext 会将具有PageTest 属性的模型向下推送到您的Border 和后续子代。这避免了完全使用FindAncestor 的需要。

    PageInstance.DataContext = model;
    

    【讨论】:

      猜你喜欢
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 2013-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多