2011-09-16 10 views
6

Tôi có mã sau và nó hoạt động tốt.Sự kiện PropertyChanged của INotifyPropertyChanged được gán như thế nào?

public partial class MainWindow : Window 
{ 
    Person person; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     person = new Person { Name = "ABC" }; 

     this.DataContext = person; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     person.Name = "XYZ"; 
    } 
} 

class Person: INotifyPropertyChanged 
{ 
    string name; 

    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
      OnPropertyChanged("Name"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string strPropertyName) 
    { 
     if(null != PropertyChanged) 
     { 
      PropertyChanged(this, 
          new PropertyChangedEventArgs(strPropertyName)); 
     }   
    } 
} 

Khi tôi tạo ra "người" đối tượng trong constructor của MainWindow, nó sẽ gán giá trị cho "Tên" tài sản của người, mà thời gian sự kiện PropertyChanged là NULL.

Nếu cùng thuộc tính lớp "người" được gán trong sự kiện Button_Click, sự kiện "PropertyChanged" là NOT NULL và nó trỏ đến OnPropertyChanged.

Câu hỏi của tôi là sự kiện "PropertyChanged" được gán cho phương thức OnPropertyChanged như thế nào?

Xin cảm ơn trước.

+0

Bạn thực sự nên thực hiện onpropertychanged của mình là 'var handler = PropertyChanged; if (null! = handler) handler (điều này, mới PropertyChangedEventArgs (strPropertyName) 'điều này sẽ giúp bạn tránh được một điều kiện chủng tộc –

Trả lời

5

Cơ sở hạ tầng liên kết dữ liệu WPF sẽ thêm trình xử lý PropertyChanged khi bạn đặt đối tượng làm DataContext, để phát hiện các thay đổi đối với thuộc tính của bạn.
Bạn có thể xem điều này xảy ra bởi setting a breakpoint.

Phương pháp OnPropertyChanged mà nó trỏ đến là một phương pháp WPF nội bộ, như bạn có thể thấy bằng cách kiểm tra thuộc tính Target của đại biểu.

2

Sự kiện sẽ là rỗng cho đến khi có nội dung nào đó được đăng ký. Vào thời điểm sự kiện bấm nút xảy ra, nó có một thuê bao (thông qua hệ thống dữ liệu).

+0

Cảm ơn câu trả lời của bạn, nhưng nó là hợp đồng với câu trả lời của SLaks.Tôi đang nhầm lẫn đó là chính xác? – Syed

+1

@Syed : Anh ta không mâu thuẫn với tôi, anh ấy chỉ cung cấp ít chi tiết hơn cho đến khi WPF đăng ký sự kiện (khi bạn liên kết với mô hình), nó là 'null' – SLaks

+1

Một cách khác để nói đó là câu trả lời của tôi ngắn gọn hơn. đùa, SLaks trả lời giải thích nó tốt hơn nhiều. –