0

Xaml バインディングが Silverlight の DependencyProperty に設定されていることを検出することは可能ですか?

たとえば、単一の依存関係プロパティを持つカスタム ユーザー コントロールと、次のように宣言されたバインディングがあるとします。

public class MyControl : UserControl
{ 
   public static readonly DependencyProperty TestProperty = 
           DependencyProperty.Register("Test", 
              typeof(object), typeof(MyControl), 
              new PropertyMetadata(null));

   public object Test
   { 
       get { return GetValue(TestProperty); } 
       set { SetValue(TestProperty, value); } 
   }
}

<MyControl Test="{Binding APropInViewModel}>
</MyControl>

MyControl コードをこのようなものにすることはできますか?

// Ctor
public MyControl()
{ 
    TestProperty.BindingChanged += new EventHandler(...)
} 

たとえば、バインディングの通知を受け取ることはできますか?

ノート:

これは、ここで説明されているトリッキーな優先順位の問題を解決するためです。そのため、DependencyPropertyChanged ハンドラーで新しい値をチェックするだけでは機能しません。プロパティが変更されたハンドラーが起動しないためです!!

4

1 に答える 1

1

このバインディングでは、値が変更される可能性があります。Dependency プロパティに対して静的な propertychanged コールバック メソッドを使用して、変更を検出できます。

public static readonly DependencyProperty TestProperty =
       DependencyProperty.Register("Test",
          typeof(object), typeof(MyControl),
          new PropertyMetadata(null, TestChangedCallbackHandler));

    private static void TestChangedCallbackHandler(DependencyObject sender, DependencyPropertyChangedEventArgs args)
    {
        MyControl obj = sender as MyControl;

        Test = args.NewValue; 
    }

ただし、これにより、次のイベント リスニング ケースが発生する可能性があります。この依存関係プロパティの変更をリッスンする場合は、このリンクで説明されています: DepencenyProperty 値の変更をリッスンします。

public void RegisterForNotification(string propertyName, FrameworkElement element, PropertyChangedCallback callback)
    {
        Binding b = new Binding(propertyName) { Source = element };
        var prop = System.Windows.DependencyProperty.RegisterAttached(
            "ListenAttached" + propertyName,
            typeof(object),
            typeof(UserControl),
            new System.Windows.PropertyMetadata(callback));

        element.SetBinding(prop, b);
    }

そして、このように呼び出します

this.RegisterForNotification("Test", this, TestChangedCallback);
于 2012-11-04T15:32:46.330 に答える