WPF 的嵌套绑定

Nested Binding With WPF

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

工作代码:

UserControl1 >> 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 >> UserControl2 >> MainWindow

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

UserControl1.xaml & 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>

在 运行 上,UserControl2 TextBox 中的文本更改未反映在 MainWindow 的 TextBlock 中。

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

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

System.Windows.Data Error: 40 : BindingExpression path error: 'MyTextUC2' property not found on 'object' ''UserControl1' (Name='text2')'. BindingExpression:Path=MyTextUC2; DataItem='UserControl1' (Name='text2'); target element is 'UserControl1' (Name='text2'); target property is 'MyTextUC1' (type 'String')

这个绑定有问题:

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

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

如果改成这样:

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

它应该开始工作了。