我是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中的基本内容,我可能会以错误的方式实现这一点。有人可以建议我在哪里错了吗?提前谢谢。
答案 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
设置为this
(UserControl1
)。因此,UserControl1
上的每个约束都将针对UserControl1
DataContext
(本身)进行评估。
如果您将其更改为:
<local:UserControl1 x:Name="text2"
MyTextUC1="{Binding MyTextUC2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type local:UserControl2}}}" />
它应该开始工作。