这是Silverlight代码 - 但我想这在WPF中会是相同的 - 我有这个简单的课程
public Class A1
{
string str1;
public string Str_1
{
return str1;
}
}
public Class B1
{
A1 a1;
public A1 A_1
{
return a1;
}
}
我假设B1 :: A1.str1的值为“my string”。
现在在XAML中我有这个
<Grid x:Name="LayoutRoot" DataContext="B1">
<StackPanel>
<TextBox Text="{Binding ElementName=A1, Path=Str_1, Mode=TwoWay}"/>
</StackPanel>
</Grid>
在代码(xaml.cs)中,我在构造函数中写了这个
LayoutRoot.DataContext = this;
(B1对象是xaml.cs文件的一部分,B1也不为空,A1不为空)
但是==&gt;这不起作用...文本框的文本不会使用A1对象中的文本进行更新。
答案 0 :(得分:2)
您正在使用元素绑定,但A1不是Xaml页面中的命名元素。
您想要Text={Binding Path=A_1.Str_1}
这意味着它指向数据上下文的A_1属性的Str_1属性(类后面的代码)。
请注意,TwoWay在这里毫无意义,因为您的房产没有设置。
要正确执行此操作(假设您的值将更改并且是必需的),您需要在A_1和Str_1属性上实现setter,并在A1和A1类上实现INotifyPropertyChanged。 B1。
答案 1 :(得分:2)
你可以说Text={Binding Path=A_1.Str_1, Mode=TwoWay}
我认为这应该有效。
此外,如果你想进行双向绑定,你需要实现INotifyPropertyChanged让WPF知道它必须在更新代码中的值后刷新UI。
GJ
答案 2 :(得分:1)
首先,您的B1类必须实现INotifyPropertyChanged like this。
然后你应该在你的B1类中创建一个属性代理:
public string Str_1
{
get
{
return a1.str1;
}
set
{
a1.str1 = value;
this.RaisePropertyChanged("Str_1"); // INotifyPropertyChanged implementation method
}
}
最后更新你的绑定:
<TextBox Text="{Binding Path=Str_1}"/>