WPF简单绑定到INotifyPropertyChanged对象

orb*_*kov 6 data-binding wpf 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>
Run Code Online (Sandbox Code Playgroud)

代码背后

   public partial class SimpleBinding : Window
    {
        public Book TheBook;

        public SimpleBinding()
        {
            TheBook = new Book() { BookName = "The Mythical Man Month" };
            InitializeComponent();
        }
    }
Run Code Online (Sandbox Code Playgroud)

书中的对象

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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

dko*_*ozl 7

首先将这DataContext="MainWindow"DataContexta删除Windowstring MainWindow,然后ElementName为您的绑定指定将绑定源定义为x:Name="TheBook"您的Window. 您可以通过ElementName=TheBook从绑定中删除并通过将 a 分配给 来使代码正常工作DataContext(如果未指定,则默认源WindowTheBook

public SimpleBinding()
{
    ...
    this.DataContext = TheBook;
} 
Run Code Online (Sandbox Code Playgroud)

或者通过指定RelativeSource您的绑定来Window公开TheBook

<TextBox Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=TheBook.BookName}"/>
Run Code Online (Sandbox Code Playgroud)

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

public partial class SimpleBinding : Window
{
    public Book TheBook { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • @orberkov 但是`DataContext =“MainWindow”`没有将`DataContext`设置为`MainWindow`的实例,而是设置为值为_MainWindow_的字符串 (7认同)
  • @RobertJørgensgaardEngdahl 不,这不是这个意思。`DataContext="MainWindow"` 会将其设置为 _MainWindow_ 字符串,仅此而已。`DataContext="{Binding ElementName=MainWindow}"` 会将其绑定到 `x:Name="MainWindow"` 控件,而 `DataContext="{StaticResource MainWindow}"` 将其设置为 `x:Key="MainWindow"`资源。您可以在调试器中检查它。此外,我可以同时拥有名为 MainWindow 的资源和控件。 (2认同)