2010-03-16 30 views
11

Tôi có tài sản phụ thuộc sau bên trong một lớp:Bắt 'này' con trỏ bên trong bất động sản phụ thuộc thay đổi callback

class FooHolder 
{ 
    public static DependencyProperty CurrentFooProperty = DependencyProperty.Register(
     "CurrentFoo", 
     typeof(Foo), 
     typeof(FooHandler), 
     new PropertyMetadata(OnCurrentFooChanged)); 

    private static void OnCurrentFooChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     FooHolder holder = (FooHolder) d.Property.Owner; // <- something like this 

     // do stuff with holder 
    } 
} 

tôi cần để có thể lấy một tham chiếu đến thể hiện đẳng cấp, trong đó tài sản đã thay đổi thuộc.

Điều này là do FooHolder có một số trình xử lý sự kiện cần được nối/chưa được mở khi giá trị của thuộc tính bị thay đổi. Thuộc tính đã thay đổi gọi lại phải là tĩnh, nhưng trình xử lý sự kiện thì không.

Trả lời

17

Cái gì đó như thế này: (bạn sẽ phải xác định UnwireFoo() và WireFoo() mình)

private static void OnCurrentFooChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    FooHolder holder = (FooHolder)d; // <- something like this 

    holder.UnwireFoo(e.OldValue as Foo); 
    holder.WireFoo(e.NewValue as Foo); 
} 

Và, tất nhiên, FooHolder phải kế thừa từ DependencyObject

+0

Và đây tôi đang tìm kiếm xung quanh các thuộc tính * bên * d, có thể nó là rõ ràng. Cảm ơn! – Mizipzor

+0

1000 lời cảm ơn cho điều này ... Tôi chỉ cần đi đến một chuyến đi của 16 giờ để tìm thấy rõ ràng .. Tài liệu MSDN dường như được viết bởi Sir Humphrey Appleby .. –

3

Chủ sở hữu của tài sản đang thay đổi là thông số d của phương thức gọi lại

3

Dựa trên câu trả lời của @ catalin-dicu, tôi đã thêm phương thức trợ giúp này vào thư viện của tôi. Nó cảm thấy tự nhiên hơn một chút khi có phương pháp OnChanged là không tĩnh và để ẩn tất cả việc đúc.

static class WpfUtils 
{ 
    public static DependencyProperty RegisterDependencyPropertyWithCallback<TObject, TProperty>(string propertyName, Func<TObject, Action<TProperty, TProperty>> getOnChanged) 
     where TObject : DependencyObject 
    { 
     return DependencyProperty.Register(
      propertyName, 
      typeof(TProperty), 
      typeof(TObject), 
      new PropertyMetadata(new PropertyChangedCallback((d, e) => 
       getOnChanged((TObject)d)((TProperty)e.OldValue, (TProperty)e.NewValue) 
      )) 
     ); 
    } 
} 

Cách sử dụng Ví dụ:

class FooHolder 
{ 
    public static DependencyProperty CurrentFooProperty = WpfUtils.RegisterDependencyPropertyWithCallback 
     <FooHolder, Foo>("CurrentFoo", x => x.OnCurrentFooChanged); 

    private void OnCurrentFooChanged(Foo oldFoo, Foo newFoo) 
    { 
     // do stuff with holder 
    } 
} 
Các vấn đề liên quan