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
设置为this
(UserControl1
)。因此 UserControl1
上的每个绑定都将针对 UserControl1
的 DataContext
(它本身)进行评估。
如果改成这样:
<local:UserControl1 x:Name="text2"
MyTextUC1="{Binding MyTextUC2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type local:UserControl2}}}" />
它应该开始工作了。
我是 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
设置为this
(UserControl1
)。因此 UserControl1
上的每个绑定都将针对 UserControl1
的 DataContext
(它本身)进行评估。
如果改成这样:
<local:UserControl1 x:Name="text2"
MyTextUC1="{Binding MyTextUC2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type local:UserControl2}}}" />
它应该开始工作了。