ElementName绑定到DependencyObject失败

时间:2019-11-26 15:18:15

标签: wpf data-binding

我实现了一个非常简单的DependencyObject(直接从DependencyObject派生),并且具有一个double类型的DependencyProperty Value

public class SimpleDepObj : DependencyObject 
{
    public static DependencyProperty ValueProperty;

    static SimpleDepObj()
    {
        var pmValue = new PropertyMetadata(3.14);
        ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(SimpleDepObj), pmValue);
    }

    public double Value
    {
        get { return (double) GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }
}

此外,我制作了此类的副本,但派生自FrameworkElement而不是DependencyObject:

public class SimpleFrmWrkElem : FrameworkElement
{
    public static DependencyProperty ValueProperty;

    static SimpleFrmWrkElem()
    {
        var pmValue = new PropertyMetadata(3.14);
        ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(SimpleFrmWrkElem), pmValue);
    }

    public double Value
    {
        get { return (double)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }
}

为了测试此类的数据绑定,我编写了以下XAML代码:

<Window ...> 
    <Window.Resources>
         <sys:Double x:Key="inputValue">4711</sys:Double>
    </Window.Resources>
    <StackPanel>
         <TextBox Name="tbxSource" Text="4712" Visibility="Hidden"/>

         <!-- First test -->
         <xamlBinding:SimpleDepObj x:Name="simpleDepObj1" Value="{Binding Source={StaticResource inputValue}}"/>
         <TextBlock Text="{Binding ElementName=simpleDepObj1, Path=Value }" Background="LightCoral"/>

         <!-- Second test -->
         <xamlBinding:SimpleDepObj x:Name="simpleDepObj2" Value="{Binding ElementName=tbxSource, Path=Text}"/>
         <TextBlock Text="{Binding ElementName=simpleDepObj2, Path=Value }" Background="LightGreen"/>

         <!-- Third test -->
         <xamlBinding:SimpleFrmWrkElem x:Name="simpleFrmWrkElem" Value="{Binding ElementName=tbxSource, Path=Text}"/>
         <TextBlock Text="{Binding ElementName=simpleFrmWrkElem, Path=Value }" Background="LightBlue"/>

    </StackPanel>
</Window>

在窗口类的资源中,有一个类型为double的StaticResource inputValue,值为4711。在StackPanel的开头,有一个文本框为“ 4712”的文本。这两个元素是我测试的输入。

在第一个测试中,我将StaticResource inputValue绑定到SimpleDepObj的Value-Property。为显示Value-Property,我添加了一个Textblock。 SimpleDepObj的Value-Property绑定到此TextBlock的Text-Property。此绑定有效,并显示期望值4711。

在第二个测试中,我尝试将TextBox tbxSource的Text-Property绑定到另一个SimpleDepObj。 不幸的是,绑定失败并显示以下消息:          System.Windows.Data错误:2:         找不到目标元素的管理FrameworkElement或FrameworkContentElement。         BindingExpression:Path = Text; DataItem = null;目标元素是“ SimpleDepObj”     (HashCode = 11958757);目标属性为“值”(类型为“双精度”)

第三个测试文件与第二个测试文件几乎相同,除了现在的绑定目标文件类型为SimpleFrmWrkElem,该对象派生自FrameworkElement。与以DependencyObject作为绑定目标的第二项测试相比,此绑定不会失败。

我现在的问题是:为什么第二项测试失败?消息找不到目标元素的管理FrameworkElement或FrameworkContentElement。是什么意思? 看起来绑定引擎无法找到textBox tbxSource(DataItem = null),但是为什么呢? 第三个测试完全相同,只是目标元素是从FrameworkElement而不是DependencyObject派生的。源元素与第二个测试完全相同。

非常感谢您提前回答!!

0 个答案:

没有答案