2009-10-29 12 views
7

Estoy tratando de simplificar algo de código, poniendo los modelos ViewModel en el código detrás de la unión y la DataContext como "presente", pero parece que funciona de manera diferente, en el siguiente ejemplo:¿Por qué OnPropertyChanged no funciona en Code Behind?

¿Por qué es cuando el se hace clic en el botón, el TextBlock vinculado a "Mensaje" no cambia, aunque se llama a OnPropertyChanged ("Mensaje")?

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> 

código subyacente:

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 


    } 
} 

Respuesta

17

usted no ha marcado su clase como disponibles para la notificación de cambio de propiedad. Cambiar el título a

public partial class Window1 : Window, INotifyPropertyChanged 

El hecho de que implemente los métodos no significa que WPF sabe que una clase soporta notificación de cambio - es necesario decir que marcándolo con INotifyPropertyChanged. De esta forma, el mecanismo de enlace puede identificar su clase como un posible objetivo de actualización.

Cuestiones relacionadas