嵌套绑定与WPF

时间:2016-02-14 07:07:10

标签: c# wpf data-binding dependency-properties

我是WPF的新手,很想知道如何在WPF中嵌套绑定属性。我做了一个示例应用程序以便更好地理解。请在下面找到以下场景。

工作代码:

  

UserControl1>>主窗口

创建一个UserControl并将其包含在mainWindow中。

UserControl1.xaml

<StackPanel>
     <TextBox x:Name="text1" Text="{Binding MyTextUC1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
     <TextBox />
</StackPanel>

UserControl1.xaml.cs

 public UserControl1()
 {
      InitializeComponent();
      this.DataContext = this;
 }

 public static readonly DependencyProperty MyTextUC1Property =
        DependencyProperty.Register("MyTextUC1", typeof(string),    typeof(UserControl1));

public string MyTextUC1
{
   get { return (string)GetValue(MyTextUC1Property); }
   set { SetValue(MyTextUC1Property, value); }
}

MainWindwo.xaml

<StackPanel>
    <local:UserControl1 x:Name="text1"/>
    <TextBlock Text="{Binding ElementName=text1, Path=MyTextUC1}" />
</StackPanel>

运行此操作时,UserControl1的TextBox中的文本更改已反映在MainWindow的TextBlock中。

不工作:

  

UserControl1&gt;&gt; UserControl2&gt;&gt;主窗口

创建一个UserControl(usercontrol1)并将其包含在另一个UserControl(usercontrol2)中,然后将其包含在mainWindow中的UserControl2中。

UserControl1.xaml&amp; UserControl1.xaml.cs

//Same as Working Code

UserControl2.xaml

<Grid>
    <local:UserControl1 x:Name="text2" MyTextUC1="{Binding MyTextUC2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</Grid>

UserControl2.xaml.cs

 public UserControl2()
 {
     InitializeComponent();
     this.DataContext = this;
 }

 public static readonly DependencyProperty MyTextUC2Property =
     DependencyProperty.Register("MyTextUC2", typeof(string), typeof(UserControl2));       

 public string MyTextUC2
 {
     get { return (string)GetValue(MyTextUC2Property); }
     set { SetValue(MyTextUC2Property, value); }
 }

MainWindwo.xaml

<StackPanel>
    <local:UserControl2 x:Name="text1"/>   //UserControl2 contains UserControl1
    <TextBlock Text="{Binding ElementName=text1, Path=MyTextUC2}" />
</StackPanel>

在运行此项时,文本在MainWindow的TextBox中未反映的UserControl2的TextBlock中发生更改。

我很确定这是WPF中的基本内容,我可能会以错误的方式实现这一点。有人可以建议我在哪里错了吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果检查调试输出,您将看到以下错误:

  

System.Windows.Data错误:40:BindingExpression路径错误:&#39; MyTextUC2&#39;在&#39; object&#39;上找不到的属性&#39;&#39;的UserControl1&#39; (名称=&#39;文本2&#39;)&#39 ;. BindingExpression:路径= MyTextUC2;的DataItem =&#39;的UserControl1&#39; (名称=&#39;文本2&#39);目标元素是&#39; UserControl1&#39; (名称=&#39;文本2&#39);目标属性是MyTextUC1&#39; (键入&#39; String&#39;)

问题出在这个绑定上:

<local:UserControl1 x:Name="text2" MyTextUC1="{Binding MyTextUC2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

正在寻找MyTextUC2中的UserControl1属性。这是因为您将DataContext的构造函数中的UserControl1设置为thisUserControl1)。因此,UserControl1上的每个约束都将针对UserControl1 DataContext(本身)进行评估。

如果您将其更改为:

<local:UserControl1 x:Name="text2" 
                    MyTextUC1="{Binding MyTextUC2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type local:UserControl2}}}" />

它应该开始工作。