2010-08-19 31 views
25

Có một ví dụ thực hiện các sự kiện yếu bằng cách sử dụng .NET WeakEventManager không?Ví dụ thực hiện các sự kiện yếu bằng cách sử dụng .NET's WeakEventManager

Tôi đang cố gắng triển khai bằng cách làm theo "Ghi chú cho người thừa kế" trong tài liệu, nhưng nó mơ hồ. Ví dụ: tôi không thể tìm ra cách gọi ProtectedAddListener từ chức năng tĩnh AddListener trong trình quản lý tùy chỉnh của mình.

Trả lời

28

Tôi đã tự mình thực hiện theo các hướng dẫn trong phần "Ghi chú cho người thừa kế" của tài liệu WeakEventManager. Đây là triển khai cơ bản của WeakEventManager. Lớp tìm nguồn cung ứng sự kiện có tên là PropertyValue và sự kiện được đặt tên theo số Changed.

public class PropertyValueChangedEventManager : WeakEventManager 
{ 
    public static PropertyValueChangedEventManager CurrentManager 
    { 
     get 
     { 
      var manager_type = typeof(PropertyValueChangedEventManager); 
      var manager = WeakEventManager.GetCurrentManager(manager_type) as PropertyValueChangedEventManager; 

      if (manager == null) 
      { 
       manager = new PropertyValueChangedEventManager(); 
       WeakEventManager.SetCurrentManager(manager_type, manager); 
      } 

      return manager; 
     } 
    } 

    public static void AddListener(PropertyValue source, IWeakEventListener listener) 
    { 
     CurrentManager.ProtectedAddListener(source, listener); 
    } 

    public static void RemoveListener(PropertyValue source, IWeakEventListener listener) 
    { 
     CurrentManager.ProtectedRemoveListener(source, listener); 
    } 

    protected override void StartListening(object source) 
    { 
     ((PropertyValue)source).Changed += DeliverEvent; 
    } 

    protected override void StopListening(object source) 
    { 
     ((PropertyValue)source).Changed -= DeliverEvent; 
    } 
} 
+10

Microsoft cung cấp PropertyChangedEventManager (http://msdn.microsoft.com/en-us/library/system.componentmodel.propertychangedeventmanager.aspx) và CollectionChangedEventManager (http://msdn.microsoft.com/en-us/ library/system.collections.specialized.collectionchangedeventmanager.aspx) được tích hợp vào .NET. –

+4

Cảm ơn ví dụ của bạn. Mặc dù triển khai ngắn hơn sẽ là nguồn '((PropertyValue)) .Changed + = DeliverEvent;' –

+1

@ alpha-mouse: Chính xác "yếu" trong "triển khai ngắn hơn" của bạn ở đâu? Tôi không thể tìm thấy nó. –

6

Sharp Observation là dự án mã nguồn mở có triển khai dễ sử dụng. Bạn có thể muốn xem mã của họ hoặc chỉ sử dụng nó như là.

Usage

Phương pháp MakeWeak() trả về một đại biểu mới mà gọi mục tiêu giống như các đại biểu ban đầu, nhưng giữ một tham chiếu yếu với mục tiêu để người nghe không được giữ sống bởi các đại biểu:

var handler= new PropertyChangingEventHandler(listener.HandleChange); 
observable.PropertyChanging += handler.MakeWeak<PropertyChangingEventHandler>(); 

Limitations

Việc thực hiện hiện nay có các hạn chế sau trên các đại biểu:

  • giá trị Return không được hỗ trợ.
  • Đối số của Không tham gia và Không được hỗ trợ.
Các vấn đề liên quan