10

オブジェクトの依存関係プロパティに対して行われたすべてのバインディングについて知る必要があるという問題があります。現在、データコンテキストが変更されるたびに依存関係のプロパティを繰り返し処理し、バインディング式を探しています。しかし、場合によっては(TabControls)、データコンテキストが最初に設定され、次にXAMLからのバインディングが適用されているように見えることがわかりました。

それで、依存関係プロパティの1つに適用されているバインディングを検出できる方法はありますか?

4

4 に答える 4

8

UserControl内にいると仮定すると、これにLoadedイベントを使用できるはずです。このイベントは、「要素がレイアウトされ、レンダリングされ、対話の準備ができた」ときに発生します。これは、バインディングが完了したことを意味しているとしか思えません。

次に、Loadedイベントハンドラーで、データコンテキストにバインドしていることを通知するだけです。

データコンテキストが変更されることが予想される場合は、これをDataContextChangedイベントハンドラーとも組み合わせる必要があります。

于 2012-06-26T13:11:02.433 に答える
2

私は、yrdatacontextがいつ正しく変更されるかを知るためにprivatestaticDataContextChangedイベントを使用していると仮定します

これが私のコードの一部ですこれが私がしていることです

 public static readonly DependencyProperty ApplicationDataContextProperty =
            DependencyProperty.Register("ApplicationDataContext",
            typeof(Object),
            typeof(MyControl),
            new PropertyMetadata(MyControl_DataContextChanged));

// my constructor

        public MyControl()
        {

                InitializeComponent();

                if (!DesignerProperties.GetIsInDesignMode(new DependencyObject()))
                {
                    SetBinding(ApplicationDataContextProperty, new Binding());
                }

        }

// my event
        private static void MyControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
        {

                MyControl thisControl = sender as MyControl
                if (thisControl != null)
                {
                    INotifyPropertyChanged propertyChanged;
                    propertyChanged = e.OldValue as INotifyPropertyChanged;
                    if (propertyChanged != null)
                        propertyChanged.PropertyChanged -= thisControl.propertyChanged_PropertyChanged;


                    propertyChanged = e.NewValue as INotifyPropertyChanged;
                    if (propertyChanged != null)
                        propertyChanged.PropertyChanged += thisControl.propertyChanged_PropertyChanged;
                }

        }

// my 2e event
        void propertyChanged_PropertyChanged(object sender, PropertyChangedEventArgs e)
        {

                if (e.PropertyName == "ListWithUsers")
                    LoadGrid();


        }
于 2012-06-26T08:35:30.747 に答える
1

NotifyOnSourceUpdated重要なバインディングで使用してみてください

http://msdn.microsoft.com/en-us/library/system.windows.data.binding.notifyonsourceupdated.aspx

または、PresentationTraceSourcesを使用して、出力ウィンドウで詳細なバインディング情報を取得することもできます。

例えば

<TextBlock Text="{Binding Name, PresentationTraceSources.TraceLevel=High}" />
于 2012-06-26T13:11:13.923 に答える
-1

プロパティが変更されたときにイベントを発生させることは、まさにINotifyPropertyChangedが行うことです。INotifyPropertyChangedを実装するために必要なメンバーが1つあり、それがPropertyChangedイベントです。

サンプルと詳細:プロパティの値が変更されるたびにイベントを発生させますか?

于 2012-06-26T08:26:01.880 に答える