2013-07-31 12 views
6

Ich habe die einfachste Bindung erstellt. Ein Textfeld, das an ein Objekt im nachfolgenden Code gebunden ist.Einfache WPF-Bindung an INotifyPropertyChanged Objekt

Event obwohl - das Textfeld bleibt leer.

Der DataContext des Fensters ist festgelegt und der Bindungspfad ist vorhanden.

Können Sie sagen, was los ist?

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> 

-Code hinter

public partial class SimpleBinding : Window 
    { 
     public Book TheBook; 

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

Das Buch Objekt

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" Was sollte Ihrer Meinung nach passieren, wenn Sie das tun? Ihr Datenkontext ist nur eine einfache Zeichenfolge namens MainWindow. Ihr Ausgabefenster sollte Ihnen auch eine Ausnahme anzeigen: Die Quelle für die Bindung mit der Referenz 'ElementName = TheBook' kann nicht gefunden werden. BindingExpression: Pfad = Buchname; Datenelement = null; Zielelement ist 'TextBox' (Name = ''); Zieleigenschaft ist 'Text' (Typ 'String'). Bitte geben Sie uns einige Informationen, was Sie erreichen möchten. – blindmeis

+0

überprüfen Sie auch http://msdn.microsoft.com/de-de/library/system.windows.data.binding.elementname.aspx, da die Bindung von ElementName nicht das ist, was Sie wollen/brauchen – blindmeis

Antwort

4

allererst DataContext="MainWindow" entfernen, da dies DataContext eines Sets Window auf einen stringMainwindow, dann geben Sie ElementName für Ihre Bindung an, die die Bindungsquelle als ein anderes Steuerelement mit x:Name="TheBook" definiert, das nicht in Ihrem Window existiert. Sie können den Code Arbeit machen, indem ElementName=TheBook von Ihrer Bindung und entweder durch DataContext zuweisen, die Standardquelle ist, wenn keiner angegeben wird, ein Window zu TheBook

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

oder durch RelativeSource Ihre Angabe an die Window Bindung, die TheBook aussetzt:

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

aber da Sie nicht auf Felder binden können benötigen Sie TheBook in Immobilien konvertieren:

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

Das Hauptproblem war: "Sie kann nicht an Felder gebunden werden, müssen Sie TheBook in Property konvertieren ". Im XAML habe ich die TextBox-Bindung folgendermaßen fixiert: ''. Der 'DataContext =" MainWindow "' bleibt erhalten. Vielen Dank! – orberkov

+6

@orberkov aber 'DataContext =" MainWindow "' Dosis nicht 'DataContext' zu einer Instanz von' MainWindow' aber zu einem String, der Wert ist _MainWindow_ – dkozl

+0

@ dkozl aber 'DataContext =" MainWindow "' setzt 'DataContext' zu etwas namens 'MainWindow' im resultierenden CLR-Objekt. Und da die '' 'x: Name =" MainWindow "' hat, wird der 'DataContext' so gesetzt, dass er dem CLR-Objekt selbst entspricht. Das ist der Grund, warum "Pfad" die richtige Eigenschaft referenziert. (Entschuldigung für die Verzögerung von 2 Jahren, aber niemand scheint diesen Kommentar angesprochen zu haben) –

Verwandte Themen