wpf数据绑定为新手

时间:2009-11-24 13:20:05

标签: c# wpf data-binding

在学习c#和wpf时,我正在努力掌握数据绑定。到目前为止不成功。我能在网上找到的所有帮助,即使被描述为“适合初学者”,对我来说也太复杂了。如果有人能够通过一个非常简单的例子提供绑定代码,我将不胜感激:

namespace BindingTest
{
    class TestClass
    {
        public int testProperty;
        public TestClass()
        {
            testProperty = 10;
        }
    }
}

namespace BindingTest
{
    public partial class Window1 : Window
    {
        TestClass iTestClass = new TestClass();
        public Window1()
        {
            InitializeComponent();
        }
        private void buttonAdd10_Click(object sender, RoutedEventArgs e)
        {
            iTestClass.testProperty += 10;
        }
    }
}

<Window x:Class="BindingTest1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <TextBox Height="25" 
                 Margin="52,0,130,89" 
                 Name="textBox1" 
                 VerticalAlignment="Bottom" 
        />
        <Button Height="34" 
                HorizontalAlignment="Left" 
                Margin="38,40,0,0" 
                Name="buttonAdd10" 
                VerticalAlignment="Top" 
                Width="62" 
                Click="buttonAdd10_Click">
        +10</Button>
   </Grid>    
</Window>

我想要做的就是将textBox1.Text绑定到iTestClass.testProperty,这样当我点击按钮时,我可以在文本框中看到它的值更改。为了实现这个目标,应该在这个简单例子的代码中做出哪些改变?

如果可以在没有INotifyPropertyChanged的情况下完成,那就是我想要的方式。 提前谢谢!

弗拉基米尔

1 个答案:

答案 0 :(得分:3)

要绑定到WPF中的属性,您有两个选项。

a) INotifyPropertyChanged
b) DependencyProperty

由于您不想使用INotifyPropertyChanged,因此您需要DependencyProperty

在MainWindow的代码隐藏中,在构造函数中添加以下行:

this.DataContext = iTestClass;

在MainWindow的XAML中,将此属性添加到TextBox:

Text="{Binding testProperty}"

按如下方式更改TestClass。

class TestClass : DependencyObject
{
    public int testProperty
    {
        get { return (int)GetValue(TestPropertyProperty); }
        set { SetValue(TestPropertyProperty, value); }
    }

    public static readonly DependencyProperty TestPropertyProperty =
        DependencyProperty.Register("testProperty", typeof(int), typeof(TestClass));

    public TestClass()
    {
        testProperty = 10;
    }
}

如果您更喜欢INotifyPropertyChanged版本,请将TestClass更改为此(其余部分相同):

class TestClass : INotifyPropertyChanged
{
    private int _testProperty;
    public int testProperty
    {
        get { return _testProperty; }
        set
        {
            if (_testProperty == value)
                return;

            _testProperty = value;

            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("testProperty"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public TestClass()
    {
        testProperty = 10;
    }
}

你为什么需要这个? WPF除非你以某种方式告诉它,否则无法判断该属性是否已更改。

WPF可以告诉它的两种方式是使用INotifyPropertyChanged提供的事件,或者通过在WPF系统中注册属性,这是DependencyProperty版本的工作方式。

如果你没有做其中一个,那么WPF将无法判断属性的值何时发生变化,因此绑定将不起作用。