2009-10-29 8 views
7

私は背後にあるコードにViewModelにモデルを置くと「これ」とのDataContextを結合することによって、いくつかのコードを簡素化しようとしているが、次の例では、異なる動作をするようです:なぜOnPropertyChangedはコードビハインドで動作しませんか?

なぜそれがありますボタンをクリックすると、OnPropertyChanged( "Message")が呼び出されても、 "Message"にバインドされたTextBlockは変更されません。

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のとそれをマークすることによって、それを伝える必要があります。このようにして、バインディング・メカニズムは潜在的な更新ターゲットとしてクラスを識別できます。

関連する問題