WPF数据绑定到Size属性

时间:2015-02-26 13:39:30

标签: c# wpf xaml data-binding 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绑定:

    <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事件的处理程序。

2 个答案:

答案 0 :(得分:3)

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

Properties (C# Programming Guide)

Data Binding Overview

答案 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);
    }
}

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