专栏首页小神仙silverlight属性改变事件通知

silverlight属性改变事件通知

工作中遇到silverlight本身没有提供的某些属性改变事件,但又需要在属性改变时得到通知,Google搬运stack overflow,原地址

 /// Listen for change of the dependency property
    public void RegisterForNotification(string propertyName, FrameworkElement element, PropertyChangedCallback callback)
    {

        //Bind to a depedency property
        Binding b = new Binding(propertyName) { Source = element };
        var prop = System.Windows.DependencyProperty.RegisterAttached(
            "ListenAttached"+propertyName,
            typeof(object),
            typeof(UserControl),
            new System.Windows.PropertyMetadata(callback));

        element.SetBinding(prop, b);
    }
RegisterForNotification("Text", this.txtMain,(d,e)=>MessageBox.Show("Text changed"));
RegisterForNotification("Value", this.sliderMain, (d, e) => MessageBox.Show("Value changed"));

更正:以上方法可能会造成回调方法callback内存泄漏,改为封装一个方法再调用callback

        /// <summary>
        /// 监听任意依赖属性值改变事件的辅助方法
        /// </summary>
        /// <param name="element"></param>
        /// <param name="propertyName"></param>
        /// <param name="callback"></param>
        public static void ListenForChange(FrameworkElement element, string propertyName, PropertyChangedCallback callback)
        {
            var b = new Binding(propertyName) { Source = element };
            var prop = DependencyProperty.RegisterAttached("ListenAttached" + propertyName, typeof(object), typeof(FrameworkElement), new PropertyMetadata(new WeakPropertyChangedCallback(callback).PropertyChangedCallback));
            element.SetBinding(prop, b);
        }

        /// <summary>
        /// 解决ListenForChange导致的内存泄漏:
        /// 避免DependencyProperty.RegisterAttached中元数据对PropertyChangedCallback的引用导致的内存泄漏
        /// 但会导致WeakPropertyChangedCallback对象本身的泄漏,WeakPropertyChangedCallback对象本身不大,可以忽略
        /// 即:以WeakPropertyChangedCallback对象的内存泄漏(很小) >>>===>>> 替代PropertyChangedCallback所在对象的内存泄漏(可能很大)
        /// 
        /// TODO:暂时未找到其他的方式, DependencyProperty.RegisterAttached、PropertyMetadata缺少相关的清除方法
        /// silverlight缺少BindingOperations.ClearBinding方法
        /// </summary>
        class WeakPropertyChangedCallback
        {
            private WeakReference callback;
            public WeakPropertyChangedCallback(PropertyChangedCallback callback)
            {

                this.callback = new WeakReference(callback);
            }

            /// <summary>
            /// 转发到callback
            /// </summary>
            /// <param name="d"></param>
            /// <param name="e"></param>
            public void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
            {
                if (callback.IsAlive)
                {
                    var cb = callback.Target as PropertyChangedCallback;
                    if (cb != null)
                        cb(d, e);
                }
            }
        }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • abp部分接口转换为首字母大写返回

    在对接手机端app接口时,由于手机端需要返回的模型使用首字母大写的形式,abp(asp.net core)接口默认返回的数据是驼峰命名法,就是首字母小写,我们自...

    用户6362579
  • css笔记

    从HTML被发明开始,样式就以各种形式存在。不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制。最初的HTML只包含很少的显示属性。 随着HTML的成...

    用户6362579
  • Silverlight多重表头实现

    用户6362579
  • 【知识星球】总有些骨骼轻奇,姿态妖娆的模型结构设计,不知道你知不知道,反正我知道一些

    大家好,欢迎来到《知识星球》专栏,这个专栏专栏剖析有三AI知识星球的内容生态,今天的内容属于网络结构1000变板块。

    用户1508658
  • Redis 分布式锁应用

    Redis 最常使用的场景是作为缓存,缓存用户信息,会话信息,还有一些热点信息。

    王小明_HIT
  • Ceph用户邮件列表Vol45-Issue4

    It is expected that the cluster log will be flooded with messages like: 2016-07-...

    用户2772802
  • Java代理类Proxy的用法

    利用代理可以在运行时创建一个实现了一组给定接口的新类。这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用。

    Ryan-Miao
  • 12岁上中科大,17岁读哈佛博士,31岁成哈佛教授…围观学神

    尹希,1983年12月出生;1996年考入中国科大少年班;2001年赴哈佛大学攻读物理学博士;2006年获得博士学位2008年尹希受聘担任哈佛大学物理系副教授;...

    华章科技
  • ASP.NET常用的一些服务器控件

    文本框控件TextBox, TextMode:值SingleLine表示单行文本,MultiLine表示多行文本,等等。 ? textbox.jpg ...

    东风冷雪
  • 图灵的文章“Computing machinery and intelligence”译文

    图灵奠基AI的力作“Computing machinery and intelligence”全文译完,摘自http://blog.sciencenet.cn...

    小菜的不能再菜

扫码关注云+社区

领取腾讯云代金券