WPF简单绑定到INotifyPropertyChanged对象

时间:2013-07-31 09:48:01

标签: wpf data-binding datacontext inotifypropertychanged

我创建了最简单的绑定。绑定到后面代码中的对象的文本框。

事件 - 文本框仍为空。

设置窗口的DataContext,并且存在绑定路径。

你能说出错了吗?

XAML

<Window x:Class="Anecdotes.SimpleBinding"
        x:Name="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SimpleBinding" Height="300" Width="300" DataContext="MainWindow">
    <Grid>
        <TextBox Text="{Binding Path=BookName, ElementName=TheBook}" />
    </Grid>
</Window>

背后的代码

   public partial class SimpleBinding : Window
    {
        public Book TheBook;

        public SimpleBinding()
        {
            TheBook = new Book() { BookName = "The Mythical Man Month" };
            InitializeComponent();
        }
    }

书籍对象

public class Book : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }

    }

    private string bookName;

    public string BookName
    {
        get { return bookName; }
        set
        {
            if (bookName != value)
            {
                bookName = value;
                OnPropertyChanged("BookName");
            }
        }
    }
}

1 个答案:

答案 0 :(得分:4)

首先删除DataContext="MainWindow",因为这会将DataContext的{​​{1}}设置为Window MainWindow ,然后指定string您的绑定将绑定源定义为另一个ElementName的控件,x:Name="TheBook"中不存在该控件。您可以通过从绑定中删除Window来使代码生效,并指定ElementName=TheBookDataContext,如果没有指定,则为WindowTheBook

public SimpleBinding()
{
    ...
    this.DataContext = TheBook;
} 

或指定RelativeSource绑定到Window TheBook的{​​{1}}:

<TextBox Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=TheBook.BookName}"/>

但由于您无法绑定到字段,因此需要将TheBook转换为属性:

public partial class SimpleBinding : Window
{
    public Book TheBook { get; set; }
    ...
}
相关问题