WPF数据绑定到Size属性

我在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绑定:

    

更新1

现在我检查了它并不依赖于作为testClass对象的子对象 – testSize属性被绑定,因此其文本框显示正确的值,但testSize.Width值未更新。 要看它只是添加:

  private void text1Changed(object sender, TextChangedEventArgs e) { MessageBox.Show(testSize.Width + " " + testSize.Height, "", MessageBoxButton.OK); } 

处理TextChanged事件。

您的testInnerSize不是属性。 这是一个领域。 属性具有get和set访问器。 您还应该实现INotifyPropertyChanged。

属性(C#编程指南)

数据绑定概述

首先,如果您想在WPF中使用数据绑定,则应声明除Field之外的Property。 所以你的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); } } 

有关详细信息,您可以在第一个答案中查看链接。