2009-10-29 4 views
7

Я пытаюсь упростить код, помещая модели ViewModel в коде позади и связывания DataContext, как «это», но это, кажется, работает по-разному, в следующем примере:Почему OnPropertyChanged не работает в Code Behind?

Почему это, когда нажимается кнопка, привязка к TextBlock к «Message» не изменяется, даже если вызывается OnPropertyChanged («Сообщение»)?

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> 

Код За:

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 


    } 
} 

ответ

17

Вы не отметили свой класс как быть доступным для уведомления об изменении свойства. Измените заголовок

public partial class Window1 : Window, INotifyPropertyChanged 

Просто потому, что вы реализуете методы не означает, что WPF знает, что класс поддерживает уведомления об изменении - вы должны сказать ему, пометив его с INotifyPropertyChanged. Таким образом, механизм привязки может идентифицировать ваш класс как потенциальную цель обновления.