C# 是否存在在属性上设置绑定时激发的事件?

C# 是否存在在属性上设置绑定时激发的事件?,c#,.net,wpf,xaml,C#,.net,Wpf,Xaml,我遇到了一个问题,我需要知道对我的对象的依赖属性所做的所有绑定。 目前,每当我的datacontext发生变化时,我都会迭代依赖属性,并寻找绑定表达式。但我发现在某些情况下(TabControls),数据上下文似乎是先设置的,然后应用来自XAML的绑定 那么,是否有一种方法可以检测应用于某个依赖项属性的绑定?当属性更改时引发事件正是INotifyPropertyChanged所做的。实现INotifyPropertyChanged需要一个成员,这就是PropertyChanged事件 示例和更多

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


那么,是否有一种方法可以检测应用于某个依赖项属性的绑定?

当属性更改时引发事件正是INotifyPropertyChanged所做的。实现INotifyPropertyChanged需要一个成员,这就是PropertyChanged事件


示例和更多详细信息:

我假设yr使用私有静态DataContextChanged事件来了解yr datacontext何时正确更改

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

 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();


        }

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

然后,您可以在加载的事件处理程序中告诉您的datacontext您正在绑定到它


如果希望datacontext发生更改,则还需要将其与
DataContextChanged
事件处理程序结合使用。

尝试在关键绑定上使用
NotifyOnSourceUpdate

或者,您也可以使用PresentationTraceSources在输出窗口中获取详细的绑定信息

比如说

<TextBlock Text="{Binding Name, PresentationTraceSources.TraceLevel=High}" />


我不想知道属性何时更改。我想知道绑定何时连接到属性。我不相信你的解决方案能做到这一点?连接绑定可能未更改属性。i、 e value=null,带绑定,value仍然=null。是的,我使用的是DataContextChanged+=事件处理程序。我在控件的构造函数中初始化Component()之前执行此操作。在OnDataContextChanged内部,对于明确绑定的绑定表达式,它返回null(绑定可以直观地工作)。但显然还没有赋值。如果我只是更改数据上下文,那么因为控件已经初始化,那么绑定表达式将完美返回。嗯。。。知道数据上下文已更改如何帮助我检测绑定何时已应用于我的对象?Josh因为当绑定已应用时,数据上下文将更改。解释起来有点复杂,但基本上是这样的,对象即数据上下文(帮助可视化另一个类的数据的助手类)知道此控件正在提供一个接口来编辑存储在绑定表达式路径中指定的属性中的对象。感谢理解我的问题。这确实是我要找的!我刚检查过,你的假设似乎成立。谢谢,实际上,
Loaded
Unloaded
在从可视化树加载/卸载元素时都会被调用,并且在该元素的生命周期内可能会发生多次(例如,主题更改可能导致元素重新加载)。你当然是对的@Grx70-我写这个答案时还年轻,没有经验;-)我现在已经删除了这句话。当加载的事件处理程序可能足够时,使用DataContextChanged事件是一种不好的做法吗?