首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否存在在属性上设置绑定时触发的事件?

是否存在在属性上设置绑定时触发的事件?
EN

Stack Overflow用户
提问于 2012-06-26 16:19:18
回答 4查看 5.8K关注 0票数 10

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-26 21:11:02

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

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

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

票数 8
EN

Stack Overflow用户

发布于 2012-06-26 16:35:31

我假设yr使用私有的静态DataContextChanged事件来知道什么时候yr的数据上下文发生了正确的变化

这是我的一些代码,这是我要做的

代码语言:javascript
复制
 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();


        }
票数 2
EN

Stack Overflow用户

发布于 2012-06-26 21:11:14

尝试在关键绑定上使用NotifyOnSourceUpdated

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

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

例如

代码语言:javascript
复制
<TextBlock Text="{Binding Name, PresentationTraceSources.TraceLevel=High}" />
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11203324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档