当属性绑定设置完成时,是否有一个事件会触发?

10

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

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


有点复杂难以解释,但基本上就是数据上下文对象(一个辅助类,用于可视化另一个类的数据)知道该控件正在呈现一个界面,用于编辑存储在绑定表达式路径中指定的属性中的对象。 - JoshG
4个回答

8
假设您在UserControl内部,您应该能够使用Loaded事件来实现此功能。当“元素布局、渲染并准备好交互”时,就会触发该事件。我只能假设这意味着绑定已完成。
然后,在Loaded事件处理程序中,您可以告诉数据上下文,您正在绑定它。
如果您希望数据上下文发生更改,则还需要结合DataContextChanged事件处理程序。

谢谢理解我的问题。这确实是我在寻找的! 我刚刚检查了一下,你的假设似乎成立。 谢谢 - JoshG
2
实际上,LoadedUnloaded会在元素从可视树中加载/卸载时被调用,并且在该元素的生命周期内可能会多次发生这种情况(例如,主题更改可能会导致元素重新加载)。 - Grx70
当然,@Grx70,你是正确的 - 当我写这个答案时,我还年轻而缺乏经验;-) 我现在已经删除了那句话。 - Isak Savo
在Loaded事件处理程序可以满足需求的情况下,使用DataContextChanged事件是否算是不良实践呢? - rollsch

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


        }

是的,我正在使用DataContextChanged +=事件处理程序。 我在控件的构造函数中的InitializeComponent()之前执行此操作。在OnDataContextChanged内部,对于明确绑定的绑定表达式(绑定在视觉上起作用),它返回null。但显然还没有被分配。 - JoshG
如果我只是更改数据上下文,那么由于控件已经初始化,绑定表达式会完美返回。 - JoshG
嗯...知道数据上下文已更改如何帮助我检测对象何时已应用绑定? - JoshG
因为一旦应用了绑定,数据上下文就会改变。 - rollsch

1

-1
当属性发生变化时引发事件,这正是INotifyPropertyChanged所做的。实现INotifyPropertyChanged所需的一个必要成员是PropertyChanged事件。
示例和更多细节:如何在属性值更改时引发事件?

我不想知道属性何时更改。我想知道绑定何时连接到属性。 我不认为你的解决方案可以做到这一点?通过连接绑定,属性可能没有更改。例如:value = null,带有绑定,value仍然= null。 - JoshG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接