2009-10-29 7 views
7

Sto cercando di semplificare il codice mettendo i modelli ViewModel nel codice dietro e vincolante il DataContext come "questo", ma sembra funzionare in modo diverso, nel seguente esempio:Perché OnPropertyChanged non funziona in Code Behind?

Perché è quando il si fa clic sul pulsante, il TextBlock associato a "Messaggio" non cambia, anche se viene chiamato OnPropertyChanged ("Message")?

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> 

Codice Dietro:

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 


    } 
} 

risposta

17

Non hanno segnato la classe come disponibili per la notifica di modifica di proprietà. Modificare l'intestazione di

public partial class Window1 : Window, INotifyPropertyChanged 

Solo perché si implementano i metodi non significa che WPF sa che una classe supporta notifica di modifica - è necessario raccontarla contrassegnando con INotifyPropertyChanged. In questo modo, il meccanismo di associazione può identificare la tua classe come potenziale obiettivo di aggiornamento.