2013-07-31 27 views
6

Ho creato il binding più semplice. Una casella di testo associata a un oggetto nel codice sottostante.WPF Collegamento semplice a INotifyPropertyChanged Object

Evento: la casella di testo rimane vuota.

Il DataContext della finestra è impostato e il percorso di collegamento è presente.

Puoi dire cosa c'è che non va?

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> 

codice dietro

public partial class SimpleBinding : Window 
    { 
     public Book TheBook; 

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

L'oggetto libro

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" ?? Cosa pensi che dovrebbe accadere quando lo fai? il tuo datacontext è solo una semplice stringa chiamata MainWindow. la finestra di output dovrebbe mostrare anche un'eccezione: Impossibile trovare l'origine per l'associazione con il riferimento 'ElementName = TheBook'. BindingExpression: Path = BookName; DataItem = null; l'elemento di destinazione è 'TextBox' (Name = ''); la proprietà target è "Testo" (digita "String"). così pls darci alcune informazioni che cosa vuoi ottenere. – blindmeis

+0

controlla anche http://msdn.microsoft.com/de-de/library/system.windows.data.binding.elementname.aspx perché il collegamento ElementName non è ciò che vuoi/hai bisogno in questo modo – blindmeis

risposta

4

Prima di tutto rimuovere DataContext="MainWindow" come questo imposta DataContext di un Window ad un stringMainWindow, quindi si specifica ElementName per l'associazione che definisce l'origine di associazione come un altro controllo con x:Name="TheBook" che non esiste nel proprio Window. Si può rendere il vostro lavoro di codice, eliminando ElementName=TheBook dal vostro legame e sia assegnando DataContext, che è fonte di default se non viene specificato, di un Window per TheBook

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

o specificando RelativeSource del vostro legame alla Window che espone TheBook:

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

ma dato che non è possibile associare ai campi è necessario convertire TheBook in proprietà:

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

Il problema principale era: "Tu non è possibile associare i campi necessari per convertire TheBook in proprietà ". In XAML ho corretto l'associazione TextBox in questo modo: ''. Il 'DataContext =" MainWindow "' rimane. Grazie! – orberkov

+6

@orberkov ma 'DataContext =" MainWindow "' dose non imposta 'DataContext' su un'istanza di' MainWindow' ma su una stringa il cui valore è _MainWindow_ – dkozl

+0

@dkozl ma 'DataContext =" MainWindow "' imposta 'DataContext' su qualcosa chiamato 'MainWindow' nell'oggetto CLR risultante. E poiché '' ha 'x: Name =" MainWindow "', 'DataContext' è impostato per essere uguale all'oggetto CLR stesso. Questo è il motivo per cui "Path" finisce per riferirsi alla proprietà giusta. (mi dispiace per il ritardo di 2 anni, ma nessuno sembra aver risposto a questo commento) –