10

我遇到了一个问题,我需要了解对对象的依赖属性所做的所有绑定。目前,每当我的数据上下文发生变化时,我都会迭代依赖属性,并寻找绑定表达式。但我发现在某些情况下(TabControls),数据上下文似乎是首先设置的,然后是来自 XAML 的绑定。

那么,有没有一种方法可以检测应用到我的依赖属性之一的绑定?

4

4 回答 4

8

假设您在 UserControl 中,您应该能够为此使用Loaded事件。当“元素布局、渲染并准备好进行交互”时触发该事件。我只能假设这意味着绑定已经完成。

然后,您可以在Loaded事件处理程序中告诉您的数据上下文您正在绑定它。

如果您希望数据上下文发生变化,您还需要将其与DataContextChanged事件处理程序结合起来。

于 2012-06-26T13:11:02.433 回答
2

我假设您使用私有静态 DataContextChanged 事件来知道您的数据上下文何时正确更改

这是我的一些代码这就是我所做的

 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 需要一个成员,即 PropertyChanged 事件

示例和更多详细信息:每当属性值更改时引发事件?

于 2012-06-26T08:26:01.880 回答