2015-01-15 30 views
6

Kịch bảnLàm thế nào để tạo ra một lớp mô hình quan sát được trong WPF

tôi nhận được một lớp mô hình từ một bộ phận bên ngoài hoặc một phần mã nơi tôi không muốn thay đổi điều gì đó. Tôi muốn ràng buộc lớp này với một số giao diện người dùng WPF. Tôi cũng muốn làm mới giao diện người dùng nếu mô hình này bị thay đổi.

Câu hỏi

Tôi có thực sự cần phải viết một lớp wrapper tất cả các thời gian, tạo ra PropertyChanged sự kiện cho mỗi setter? Làm thế nào tôi có thể ngăn chặn để viết tất cả các đầu mối này bằng tay?

gì bắt đầu như thế này ...

public class User : IUser 
{ 
    public String Name { get; set; } 
    public bool CurrentlyLoggedIn { get; set; } 

    // ... 
} 

... sẽ luôn luôn được cồng kềnh như vậy

public class UserObservableWrapper : IUser, INotifyPropertyChanged 
{ 
    public String Name 
    { 
     get 
     { 
      return this.innerUser.Name; 
     } 
     set 
     { 
      if (value == this.innerUser.Name) 
      { 
       return; 
      } 

      this.innerUser.Name = value; 
      this.OnPropertyChanged("Name"); 
     } 
    } 

    public bool CurrentlyLoggedIn 
    { 
     get 
     { 
      return innerUser.CurrentlyLoggedIn; 
     } 
     set 
     { 
      if (value.Equals(innerUser.CurrentlyLoggedIn)) 
      { 
       return; 
      } 
      innerUser.CurrentlyLoggedIn = value; 
      this.OnPropertyChanged("CurrentlyLoggedIn"); 
     } 
    } 

    private readonly IUser innerUser; 

    public UserObservableWrapper(IUser nonObservableUser) 
    { 
     this.innerUser = nonObservableUser; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = this.PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Có phải là một cách thông minh hơn để làm điều đó !?

+0

Tôi đã nghe nói về những người sử dụng kỹ thuật định hướng Aspect để chèn chức năng như vậy vào mã. Thanh toán www.PostSharp.net. Trang đích thậm chí đề cập đến INotifyPropertChanged cụ thể. – Crowcoder

+0

@Crowcoder http://www.postsharp.net/model/inotifypropertychanged điều này có vẻ tuyệt vời, nhưng nó đòi hỏi anh ta để có thể chỉnh sửa các lớp mô hình, và như ông đã chỉ định, họ đến từ một thành phần bên ngoài. Bạn có biết nếu 'PostSharp' có khả năng thực hiện điều này khi chạy không? –

+0

@Moti Tôi không hiểu nhiều về bản thân nên tôi ngần ngại làm nhiều hơn là chỉ nói "kiểm tra điều này, nó có thể hữu ích", nhưng tôi thấy họ làm dệt thoi thời gian và dệt tĩnh thời gian chạy có vẻ như không cần để sửa đổi mã thực tế của thư viện bạn đang sử dụng. http://www.postsharp.net/aop.net/runtime-weaving – Crowcoder

Trả lời

3

Nếu nó không xảy ra nhiều lần trong mã của bạn, tôi khuyên bạn nên làm mã soạn sẵn.

Nếu không, bạn có thể sử dụng cool piece of code từ Ayende này để tạo lớp proxy tự động triển khai INotifyPropertyChanged cho bạn (bao gồm cả tăng sự kiện). Cách sử dụng sẽ trông giống như sau:

IUser userProxy = DataBindingFactory.Create<User>(); 
Các vấn đề liên quan