我在WPF中遇到数据绑定问题,这是我的示范类:
public class testClass
{
public Size testInnerSize;
public testClass()
{
testInnerSize = new Size(66, 99);
}
}
我想将我的表单中的TextBox绑定到testInnerSize的属性,让我们说Width。所以我将此文本框的DataContext设置为testClass对象和XAML:
<TextBox Text="{Binding Path=testInnerSize.Width }" Name="textBox3" (...)
但是它不起作用,文本框是空的而不是值66.另一方面,当我将DataContext设置为testObject.testInnerSize时,该值显示在文本框中,但是在对象之后它没有更新文字修改。
所以问题是:我如何双向绑定作为另一个对象属性的Size对象的Width属性?
用于测试的完整代码:
public partial class testpage : Page
{
public Size testSize;
testClass testObject = new testClass();
public testpage()
{
InitializeComponent();
testSize = new Size(6, 9);
textBox2.DataContext = testSize;
textBox3.DataContext = testObject;
}
private void textChanged(object sender, TextChangedEventArgs e)
{
MessageBox.Show(testObject.testInnerSize.Width + " " + testObject.testInnerSize.Height, "", MessageBoxButton.OK);
}
}
public class testClass
{
public Size testInnerSize;
public testClass()
{
testInnerSize = new Size(66, 99);
}
}
XAML绑定:
<TextBox Text="{Binding Path=Width }" Name="textBox2" />
<TextBox Text="{Binding Path=testInnerSize.Width }" Name="textBox3" TextChanged="textChanged" />
更新1
现在我已经检查过它并不依赖于作为testClass对象的子对象 - testSize属性被绑定,因此其文本框显示正确的值,但testSize.Width值未被更新。要看它只是添加:
private void text1Changed(object sender, TextChangedEventArgs e)
{
MessageBox.Show(testSize.Width + " " + testSize.Height, "", MessageBoxButton.OK);
}
TextChanged事件的处理程序。
答案 0 :(得分:3)
您的testInnerSize不是属性。这是一个领域。属性具有get和set访问器。您还应该实现INotifyPropertyChanged。
答案 1 :(得分:0)
首先,如果你想在WPF中使用数据绑定,你应该声明一个不是字段的属性。所以你的testClass
应该是这样的:
public class testClass
{
public Size testInnerSize
{
get;
set;
}
public testClass()
{
testInnerSize = new Size(66, 99);
}
}
如果您想利用双向绑定,则需要引入INotifyPropertyChanged接口。
public class testClass : INotifyPropertyChanged
{
private Size _testInnerSize;
public event PropertyChangedEventHandler PropertyChanged;
public Size testInnerSize
{
get
{
return this._testInnerSize;
}
set
{
this._testInnerSize = value;
if (null != PropertyChanged)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("testInnerSize"));
}
}
}
public testClass()
{
testInnerSize = new Size(66, 99);
}
}
有关详细信息,您可以在第一个答案中查看链接。