2013-07-31 18 views
6

Stworzyłem najprostsze powiązanie. Pole tekstowe powiązane z obiektem w kodzie.Proste wiązanie WPF do obiektu INotifyPropertyChanged

Zdarzenie - pole tekstowe pozostaje puste.

Kontekst DataContext okna jest ustawiona, a ścieżka wiązania jest obecna.

Czy możesz powiedzieć, co jest nie tak?

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> 

kod za

public partial class SimpleBinding : Window 
    { 
     public Book TheBook; 

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

Przedmiotem książka

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" Jak myślisz, co powinno się stać, gdy to zrobisz? twój datacontext to prosty ciąg o nazwie MainWindow. w oknie wyjściowym powinien pojawić się również wyjątek: Nie można znaleźć źródła do powiązania z odniesieniem "ElementName = TheBook". BindingExpression: Path = BookName; DataItem = null; elementem docelowym jest 'TextBox' (Name = ''); Właściwością target jest "Text" (wpisz "String"). więc proszę dać nam trochę informacji, co chcesz osiągnąć. – blindmeis

+0

sprawdź także http://msdn.microsoft.com/de-de/library/system.windows.data.binding.elementname.aspx, ponieważ powiązanie ElementName nie jest tym, czego potrzebujesz/potrzebujesz w ten sposób. – blindmeis

Odpowiedz

4

Przede wszystkim usunąć DataContext="MainWindow" jak to określa DataContext od a Window do stringMainWindow, następnie określasz ElementName dla wiązania, które definiuje źródło wiązania jako kolejną formant z x:Name="TheBook", która nie istnieje w twoim Window. Można zrobić swoją pracę kodu poprzez usunięcie ElementName=TheBook ze swojego wiązania i albo poprzez przypisanie DataContext, który jest domyślnym źródłem, jeśli nie zostanie określony, znaczny Window do TheBook

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

lub podając RelativeSource twoich wiązania do Window który naraża TheBook:

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

ale skoro nie może wiązać się z pól będzie trzeba konwertować TheBook do nieruchomości:

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

Głównym problemem było: "Ty nie można powiązać z polami, które będą potrzebne do przekonwertowania TheBook na właściwość ". W XAML naprawiłem powiązanie TextBox w następujący sposób: ''. "DataContext =" MainWindow "' pozostaje. Dziękuję Ci! – orberkov

+6

@orberkov ale "DataContext =" MainWindow "' dawka nie ustawiła 'DataContext' na instancję' MainWindow' ale na łańcuch, którego wartością jest _MainWindow_ – dkozl

+0

@dkozl, ale 'DataContext =" MainWindow "' ustawia 'DataContext' na coś o nazwie 'MainWindow' w wynikowym obiekcie CLR. A ponieważ '' ma 'x: Name =" MainWindow "', 'DataContext' jest ustawiony na równy samemu obiektowi CLR. Dlatego 'Path' kończy się odwoływaniem do właściwej właściwości. (przepraszam za 2 lata opóźnienia, ale nikt chyba nie zajął się tym komentarzem) –