2009-10-29 4 views
7

Ich versuche, einige Code, indem die Ansichtsmodell Modelle in den Code hinter und Binden des Datacontext als „das“ zu vereinfachen, aber es scheint anders zu arbeiten, in dem folgenden Beispiel:Warum funktioniert OnPropertyChanged nicht in Code Behind?

Warum es ist, wenn die Wenn Sie auf die Schaltfläche klicken, ändert sich der an "Message" gebundene TextBlock nicht, obwohl OnPropertyChanged ("Message") aufgerufen wird.

XAML:

<Window x:Class="TestSimple223.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel HorizontalAlignment="Left"> 
     <Button Content="Button" 
       Click="button1_Click" /> 
     <TextBlock 
      Text="{Binding Path=Message, Mode=TwoWay}"/> 
     <TextBlock 
      x:Name="Message2"/> 
    </StackPanel> 
</Window> 

-Code Behind:

using System.Windows; 
using System.ComponentModel; 

namespace TestSimple223 
{ 
    public partial class Window1 : Window 
    { 
     #region ViewModelProperty: Message 
     private string _message; 
     public string Message 
     { 
      get 
      { 
       return _message; 
      } 

      set 
      { 
       _message = value; 
       OnPropertyChanged("Message"); 
      } 
     } 
     #endregion 

     public Window1() 
     { 
      InitializeComponent(); 
      DataContext = this; 

      Message = "original message"; 
      Message2.Text = "original message2"; 
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     { 
      Message = "button was clicked, message changed"; 
      Message2.Text = "button was click, message2 changed"; 
     } 

     #region INotify 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
     #endregion 


    } 
} 

Antwort

17

Sie haben die Klasse nicht markiert als für Immobilien-Änderungsbenachrichtigung zur Verfügung stehen. Ändern Sie die Überschrift

public partial class Window1 : Window, INotifyPropertyChanged 

Nur weil Sie die Methoden implementieren bedeutet nicht, dass WPF weiß, dass eine Klasse Änderungsbenachrichtigung unterstützt - man muss es sagen, indem sie sie mit INotifyPropertyChanged Markierung. Auf diese Weise kann der Bindungsmechanismus Ihre Klasse als potenzielles Updateziel identifizieren.