以下代码的问题是:绑定到SomeClassProp.SubTextProp
不起作用(源属性未设置为文本框内容),而TextProp
则绑定到<{1}}。
XAML:
<Window x:Class="TestWPF.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Name="wMain"
SizeToContent="WidthAndHeight">
<StackPanel>
<TextBox Text="{Binding ElementName=wMain, Path=SomeClassProp.SubTextProp}" Width="120" Height="23" />
<TextBox Text="{Binding ElementName=wMain, Path=TextProp}" Width="120" Height="23" />
</StackPanel>
</Window>
和代码:
public partial class MainWindow : Window
{
public SomeClass SomeClassProp { get; set; }
public string TextProp { get; set; }
public MainWindow()
{
InitializeComponent();
SomeClassProp = new SomeClass();
}
}
public class SomeClass
{
public string SubTextProp { get; set; }
}
我错过了一些明显的东西吗?
请注意,我需要此绑定才能从目标(文本框)到源(类属性)。
更新:当我将绑定从ElementName=wMain
更改为RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}
时 - BOTH绑定有效。所以问题是ElementName
绑定属性特有的。
答案 0 :(得分:4)
好的,最后,我发现了问题!
将diag:PresentationTraceSources.TraceLevel=High
添加到绑定defs(非常有用的东西btw,在没有正常的ol'逐步调试)的情况下,我在输出中看到以下内容:
System.Windows.Data Warning: 108 : BindingExpression (hash=54116930): At level 0 - for MainWindow.SomeClassProp found accessor RuntimePropertyInfo(SomeClassProp) System.Windows.Data Warning: 104 : BindingExpression (hash=54116930): Replace item at level 0 with MainWindow (hash=47283970), using accessor RuntimePropertyInfo(SomeClassProp) System.Windows.Data Warning: 101 : BindingExpression (hash=54116930): GetValue at level 0 from MainWindow (hash=47283970) using RuntimePropertyInfo(SomeClassProp): System.Windows.Data Warning: 106 : BindingExpression (hash=54116930): Item at level 1 is null - no accessor System.Windows.Data Warning: 80 : BindingExpression (hash=54116930): TransferValue - got raw value {DependencyProperty.UnsetValue} System.Windows.Data Warning: 88 : BindingExpression (hash=54116930): TransferValue - using fallback/default value '' System.Windows.Data Warning: 89 : BindingExpression (hash=54116930): TransferValue - using final value ''
问题是MainWindow初始化的顺序!
所以在构造绑定的那一刻,我的0级属性(SomeClassProp
)尚未初始化,导致绑定完全失败(由于某种原因没有发出正常级别的binging警告)。 / p>
长话短说 - 在SomeClassProp
构造函数中的InitializeComponent()
之前移动MainWindow
初始化,然后绑定开始与ElementName
一起使用:
public MainWindow()
{
SomeClassProp = new SomeClass();
InitializeComponent();
}
问题的答案 - 为何使用RelativeSource
属性 - 它位于输出日志的这些行中:
System.Windows.Data Warning: 66 : BindingExpression (hash=28713467): RelativeSource (FindAncestor) requires tree context
System.Windows.Data Warning: 65 : BindingExpression (hash=28713467): Resolve source deferred
使用RelativeSource
进行数据上下文初始化需要树上下文,并且在构造Window
之后(到那时SomeClassProperty
已经初始化)推迟到某个时间点。