RelativeSource适用于(嵌套)子属性,而ElementName则不适用

时间:2013-08-24 13:19:39

标签: c# wpf xaml data-binding elementname

以下代码的问题是:绑定到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绑定属性特有的。

1 个答案:

答案 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已经初始化)推迟到某个时间点。