2013-07-31 106 views
6

我創建了最簡單的綁定。綁定到後面代碼中的對象的文本框。WPF簡單綁定到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"); 
      } 
     } 
    } 
} 
+3

DataContext =「MainWindow」??當你這樣做時,你認爲應該發生什麼?你的datacontext只是一個叫做MainWindow的簡單字符串。你的輸出窗口也會顯示一個異常:找不到與引用'ElementName = TheBook'綁定的源。 BindingExpression:路徑= BOOKNAME;的DataItem = NULL;目標元素是'TextBox'(Name ='');目標屬性是'文本'(類型'String')。所以請給我們一些你想達到的信息。 – blindmeis

+0

還檢查http://msdn.microsoft.com/de-de/library/system.windows.data.binding.elementname.aspx,因爲ElementName綁定不是您想要/需要的這種方式 – blindmeis

回答

4

首先,去除DataContext="MainWindow",因爲這集的WindowDataContextstring主窗口,那麼你指定ElementName作爲你的綁定,它將綁定源定義爲x:Name="TheBook"的另一個控件,它不存在於你的Window中。您可以通過刪除ElementName=TheBook使你的代碼工作的結合,要麼通過分配DataContext,如果沒有指定一個WindowTheBook

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

或通過指定您的RelativeSource結合Window這是默認的來源,公開TheBook

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

但因爲你不能綁定到字段,你將需要TheBook轉換成屬性:

public partial class SimpleBinding : Window 
{ 
    public Book TheBook { get; set; } 
    ... 
} 
+0

主要問題是:「您無法綁定到您需要將TheBook轉換爲屬性的字段「。在XAML中,我修復了像這樣的TextBox綁定:''。 'DataContext =「MainWindow」'仍然存在。謝謝! – orberkov

+6

@orberkov但DataContext =「MainWindow」不會將DataContext設置爲「MainWindow」的實例,而是設置爲值爲_MainWindow_ – dkozl

+0

@dkozl但是DataContext =「MainWindow」設置「DataContext」爲某個名稱所產生的CLR對象中的「MainWindow」。由於''具有'x:Name =「MainWindow」',所以'DataContext'被設置爲等於CLR對象本身。這就是爲什麼'Path'結束引用正確的屬性。 (抱歉,延遲2年,但似乎沒有人處理這個評論) –