我实现了一个非常简单的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派生的。源元素与第二个测试完全相同。
非常感谢您提前回答!!