2009-10-29 16 views
7

Tôi đang cố gắng đơn giản hóa một số mã bằng cách đặt các mô hình ViewModel vào mã phía sau và ràng buộc DataContext là "này", nhưng dường như hoạt động khác nhau, trong ví dụ sau:Tại sao OnPropertyChanged không hoạt động trong Code Behind?

Tại sao khi nút được nhấp vào, TextBlock ràng buộc để "Tin nhắn" không thay đổi, mặc dù OnPropertyChanged ("Message") được gọi là?

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> 

Mã Đằng sau:

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 


    } 
} 

Trả lời

17

Bạn chưa đánh dấu lớp học của bạn như là có sẵn để thông báo thay đổi sở hữu. Thay đổi tiêu đề để

public partial class Window1 : Window, INotifyPropertyChanged 

Chỉ vì bạn thực hiện các phương pháp không có nghĩa là WPF biết rằng một lớp hỗ trợ thông báo thay đổi - bạn cần phải nói với nó bằng cách đánh dấu nó với INotifyPropertyChanged. Bằng cách này, cơ chế ràng buộc có thể xác định lớp của bạn là một mục tiêu cập nhật tiềm năng.

Các vấn đề liên quan