2011-09-08 47 views
5

Tôi chưa bao giờ sử dụng INotifyPropertyChanged và tôi đang xem xét sử dụng nó rộng rãi trong suốt một ứng dụng mới.INotifyPropertyThay đổi sử dụng bên ngoài ràng buộc dữ liệu

Câu hỏi của tôi là, 'thích hợp' có sử dụng giao diện INotifyPropertyChanged để cung cấp thông báo sự kiện cho những thứ ngoài điều khiển dữ liệu không?

Dường như từ một loạt các ví dụ trực tuyến mà giao diện này được sử dụng rộng rãi để thông báo lưới và như vậy khi dữ liệu được thay đổi. Tôi có nhiều kịch bản khác nhau, nơi tôi cần các lớp khác để được thông báo về các thay đổi dữ liệu trong các lớp khác, và tôi tự hỏi bạn có nghĩ rằng nó sạch hơn để thực hiện giao diện này hay không và thực hiện cuộc gọi thay đổi trên setters.

+3

Chỉ cần tò mò: Tại sao thực hiện cuộc gọi đã thay đổi trên bộ nạp? – WaltiD

+0

Cảm ơn bạn đã chỉ ra điều đó, không có nghĩa là bao gồm điều đó. Tôi đã cập nhật câu hỏi. – mservidio

Trả lời

4

Khi thực hiện một sự lựa chọn như thế này, tôi nghiêng về phía sử dụng các tính năng ngôn ngữ trên các cấu trúc khác.

Một nhược điểm nghiêm trọng đối với INotifyPropertyChanged là nó chỉ cung cấp tên thuộc tính dưới dạng chuỗi khi cập nhật và các lớp tiêu thụ của bạn phải phân tích cú pháp chuỗi đó và quyết định cách thực hiện.

Với sự kiện bạn có thể cung cấp bất kỳ loại chữ ký đại biểu nào mà sự kiện yêu cầu và các lớp tiêu thụ có thể hành động trực tiếp trên thay đổi đó.

Nếu bạn nhìn trộm dưới mui xe, bạn sẽ thấy rằng INotifyPropertyChanged vẫn là sự kiện, vậy tại sao không sử dụng sự kiện trực tiếp?

+0

Tôi đang hướng đến việc sử dụng các sự kiện thông thường. Tôi đồng ý và những sự kiện được đánh máy mạnh mẽ sẽ đẹp hơn khi làm việc cùng. Khi tôi đang sử dụng một mẫu tạo mã T4, bạn có nghĩ rằng nó sẽ là quá mức cần thiết để thêm một sự kiện đã thay đổi cho mỗi thuộc tính trong các lớp của tôi? – mservidio

+0

@mservidio - Tôi không quen thuộc với T4, nhưng tôi đặt cược có một hành vi lớp rõ ràng hơn mà bạn có thể cập nhật thay vì mỗi thuộc tính. –

2

Tôi nghĩ bạn có thể sử dụng Giao diện này cho những tình huống đó nhưng bạn phải thực sự nghĩ kỹ nếu bạn muốn cuộc đảo chính giữa các lớp học của bạn. Nếu điều này có ý nghĩa với bạn - chắc chắn, tại sao tái tạo lại bánh xe?

1

Tôi nghĩ bạn nên tiến hành triển khai giao diện INotifyPropertyChanged, chỉ vì nó có mục đích đó và giao diện người dùng của nó sử dụng để đón thay đổi, không cần tự tạo sự kiện tùy chỉnh.

0

WPF và Silverlight đều sử dụng INotifyPropertyChanged rộng rãi trong hệ thống ràng buộc dữ liệu. Nếu bạn đang đi để databind cho các đối tượng của bạn, bạn chắc chắn nên sử dụng INotifyPropertyChanged. |

Nếu không, theo như tôi biết, nó không ảnh hưởng đến các công nghệ .NET Framework. IN2 không phải là cách thông báo sạch nhất khi tài sản của bạn thay đổi, tùy thuộc vào cách bạn nhìn vào nó, vì có một sự kiện và một chuỗi với tên đặc tính, bạn sẽ phải thực hiện một câu lệnh chuyển đổi. Nó chắc chắn là dễ dàng hơn để thực hiện so sánh với các sự kiện cho mỗi tài sản mặc dù

0

Tôi sẽ không sử dụng INotifyPropertyChanged cho bất kỳ điều gì ngoại trừ databinding. Giao diện này có lẽ là tùy chọn duy nhất cho databinding vì điều khiển sẽ hành động trên PropertyChanged sự kiện không biết trước của người gửi trước. Bởi vì databinding đó phải sử dụng một giao diện chung như vậy.

Đối với các loại và kịch bản của riêng tôi, tôi sẽ sử dụng các sự kiện thông thường (một sự kiện cho mỗi thuộc tính có thể thay đổi giá trị của nó). INotifyPropertyChanged trong các trường hợp như vậy là loại mã được nhập gọn. Bạn có thể thấy rằng ngay cả WPF chính nó vẫn còn đầy đủ các sự kiện oldscool (FrameworkElement ví dụ với rất nhiều sự kiện ***Changed).

0

Tôi nghĩ rằng INotifyPropertyChanged thường là cơ chế phù hợp cho thông báo dựa trên thông tin đẩy về cập nhật giá trị thuộc tính.

Alternative:

Tuy nhiên, nó không phải là cơ chế chỉ có thể hướng tới mục tiêu đó. Ví dụ, Windows Forms cũng hỗ trợ các sự kiện …Changed riêng biệt cho mỗi thuộc tính; tức là nếu bạn có một tài sản có tên là Foo, bạn có thể có sự kiện FooChanged được liên kết sẽ được kích hoạt trong thiết lập của Foo.

Có riêng biệt …Changed sự kiện có lợi thế là cụ thể cho một thuộc tính cụ thể và do đó không yêu cầu người quan sát/người đăng ký lọc ra thông báo cho thuộc tính mà họ không quan tâm. Mặt khác, (dữ liệu) của bạn các đối tượng có thể bắt đầu cảm thấy "cồng kềnh" khi bạn phải khai báo 50 sự kiện …Changed bổ sung.

Một số lưu ý về việc thực hiện INotifyPropertyChanged:

  • Nếu bạn cảm thấy mệt mỏi tái viết code soạn sẵn cùng một lần nữa và một lần nữa ...:

    public T SomeProperty 
    { 
        get { … } 
        set 
        { 
         if (someProperty != value) 
         { 
          someProperty = value; 
          NotifyPropertyChanged("SomeProperty"); 
         } 
        } 
    } 
    private T someProperty; 
    

    sau đó bạn có thể muốn xem xét một khuôn khổ AOP (như PostSharp). Tôi nhớ có một thư viện trên CodePlex hoặc Google Code tự động triển khai INotifyPropertyChanged cho bạn (hoặc viết lại CIL bytecode); tiếc là tôi không thể nhớ tên của thư viện.

  • Có các giao diện liên quan khác INotifyPropertyChanging, INotifyListChanged, v.v. Bạn cũng có thể muốn xem những điều này.

0

Dont sử dụng là trong các tình huống khác, nếu bạn cần phải thông báo cho các lớp miền khác sử dụng các sự kiện miền thay vào đó, mà sẽ được kinh doanh hơn theo định hướng và mô tả và mạnh mẽ gõ

0

Tôi không phải là một fan hâm mộ của INPC ngoài của các cõi UI vì nó ẩn đi một thực tế là các sự kiện quan trọng đang được tạo ra bởi các cá thể của đối tượng. Ngoài ra, nếu tôi sử dụng lớp học của mình triển khai INPC, tôi sẽ mong đợi tất cả các thuộc tính phát sóng thông báo, nếu chỉ một số trong số đó thực hiện, đó là lỗi trong thời gian chạy có thể không được chú ý.

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