WPF控件的嵌套属性'的数据绑定

本文关键字:数据绑定 属性 控件 嵌套 WPF | 更新日期: 2023-09-27 18:15:40

我试图开发用户控件与一些嵌套的属性,允许使用数据绑定来设置它。例如,我有这样的内容:

// Top level control
public class MyControl : Control
{
    public string TopLevelTestProperty
    {
        get { return (string)GetValue(TopLevelTestPropertyProperty); }
        set { SetValue(TopLevelTestPropertyProperty, value); }
    }
    public static readonly DependencyProperty TopLevelTestPropertyProperty =
        DependencyProperty.Register("TopLevelTestProperty", typeof(string), typeof   
           (MyControl), new UIPropertyMetadata(""));
    // This property contains nested object
    public MyNestedType NestedObject
    {
        get { return (MyNestedType)GetValue(NestedObjectProperty); }
        set { SetValue(NestedObjectProperty, value); }
    }
    public static readonly DependencyProperty NestedObjectProperty =
        DependencyProperty.Register("NestedObject", typeof(MyNestedType), typeof 
            (MyControl), new UIPropertyMetadata(null));
}
// Nested object's type
public class MyNestedType : DependencyObject
{
    public string NestedTestProperty
    {
        get { return (string)GetValue(NestedTestPropertyProperty); }
        set { SetValue(NestedTestPropertyProperty, value); }
    }
    public static readonly DependencyProperty NestedTestPropertyProperty =
        DependencyProperty.Register("NestedTestProperty", typeof(string), typeof
            (MyNestedType), new UIPropertyMetadata(""));
}
// Sample data context
public class TestDataContext
{
    public string Value
    {
        get
        {
            return "TEST VALUE!!!";
        }
    }
}
...
this.DataContext = new TestDataContext();
...
XAML:

      <local:mycontrol x:name="myControl" topleveltestproperty="{Binding Value}" >
         <local:mycontrol.nestedobject>
            <local:mynestedtype x:name="myNestedControl" nestedtestproperty="{Binding Value}" />
         </local:mycontrol.nestedobject>
      </local:mycontrol>

它对TopLevelTestProperty属性工作得很好,但对NestedTestProperty不起作用。嵌套绑定似乎不起作用。有人能帮帮我吗?有办法做这样的绑定吗?我认为这是因为我的嵌套对象没有任何引用的顶层对象,所以它不能解决使用MyControl的DataContext。

WPF控件的嵌套属性'的数据绑定

<p正确,嵌套控件不从mycontrol继承DataContext。把它显式地设置出来:>
<local:mycontrol x:name="myControl" 
                 topleveltestproperty="{Binding Value}" >          
   <local:mycontrol.nestedobject>             
           <local:mynestedtype x:name="myNestedControl" 
                               DataContext="{Binding ElementName=myControl,
                                                     Path=DataContext}"
                               nestedtestproperty="{Binding Value}" />          
  </local:mycontrol.nestedobject>       
</local:mycontrol>