另一个WPF绑定语法问题

时间:2011-06-14 01:43:13

标签: wpf binding

这次我的测试代码显示了一个TextBox和两个TextBlocks。 TextBox和第一个TextBlock通过双向数据绑定连接到数据上下文的字符串属性。第二个TextBlock由TextBox的TextChanged事件上的事件处理程序更新,该事件处理程序将其设置为字符串属性的当前值。

当窗口加载时,两个TextBlock都正确初始化。但是当我输入TextBox时,只有第二个更新。更新第二个TextBlock的事实确认TextBox与字符串属性的双向绑定正在起作用。但为什么第一个TextBlock没有更新?

标记:

<Window x:Class="DataBinding.SimpleDataBinding"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SimpleDataBinding" Height="300" Width="300" >
    <StackPanel>
        <TextBox Name="txtPerson" Text="{Binding Path=Person, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        <TextBlock Name="tbPerson1" Text="{Binding Path=Person, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        <TextBlock Name="tbPerson2" />
    </StackPanel>
</Window>

代码背后:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace DataBinding
{
    public partial class SimpleDataBinding : Window
    {
        public string Person { get; set; }

        public SimpleDataBinding() {
             InitializeComponent();
             Person = "George";
             DataContext = this;
             txtPerson.TextChanged += new TextChangedEventHandler(txtPerson_TextChanged);
        }

        private void txtPerson_TextChanged(object sender, TextChangedEventArgs e) {
            tbPerson2.Text = Person;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您的第二个文本框未通过数据绑定进行更新 - 它正在更新,因为您正在事件处理程序中直接更改其值。

您的代码需要实现INotifyPropertyChanged接口。这个接口和实现是数据绑定的关键,如果你正在学习WPF / Silverlight并想要使用数据绑定,你需要学习所有关于这个接口以及如何实现它。

INotifyPropertyChanged

这是一个基本实现(来自上面的链接):

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
}

以下是您希望如何将它用于您的示例(未经测试但未输入IDE,因此可能有错误):

private string _person;
public string Person 
{ 
    get {return _person;}
    set 
    {
        if (value == _person) return;
        _person = value;
        NotifyPropertyChanged("Person");
    }
}

然后你可以摆脱这一行:

txtPerson.TextChanged += new TextChangedEventHandler(txtPerson_TextChanged);

并将绑定添加到第二个文本块:

<TextBlock Name="tbPerson2" Text="{Binding Path=Person, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

您也可以从文本框和文本块中删除名称,因为在使用数据绑定时几乎不需要名称。