信息系统开发平台OpenExpressApp - 如何解决ComboBox.TextProperty绑定带来问题的来龙去脉-阿里云开发者社区

开发者社区> 技术小胖子> 正文

信息系统开发平台OpenExpressApp - 如何解决ComboBox.TextProperty绑定带来问题的来龙去脉

简介:
+关注继续查看

前一阵子写了好几篇处理WPF内存泄漏和bug的blog,本篇继续,主要围绕一下ComboBox的绑定问题来讲,通过此bug的分析和解决过程,希望能给大家对处理bug带来一些思路。

问题描述

  在OpenExpressApp中一直没有注意,测试人员提交了一个bug,现象是这样的:

  1. 选择左边任意一个列表项后,再选择一个PBS模板
  2. 切换左边列表项后,发现右边PBS模板显示为空白,没有内容

发现问题

  既然是下拉列表操作后出现问题,那么我就在下拉操作时设置了一个断点,我加了一条更新ComboBox文本框内容的代码,想看看是否有效果:

 

this._cmbGrid.GetBindingExpression(ComboBox.TextProperty).UpdateTarget()

  运行后竟然发现报空对象引用错误this._cmbGrid.GetBindingExpression(ComboBox.TextProperty)获取的是个空对象。如果熟悉OpenExpressApp的AutoUI设计的应该知道,在编辑器控件生成时会给生成控件进行Text绑定,按道理应该不会出现绑定不了的问题,既然出现了,那么就最可能是绑定出现了问题。

  那么问题处在哪呢?我突然想起,会不会是因为直接给ComboBox的Text属性赋值导致,由于直接赋值而清空绑定

简化问题

  上面只是一个猜测,可能是Text赋值后导致,于是做了一个简单的程序,只是一个combox控件和button控件,在button上写了以下代码:

 

            cb.SetBinding(ComboBox.TextProperty, b);
            cb.GetBindingExpression(ComboBox.TextProperty).UpdateTarget();
            cb.Text = "111";
            cb.GetBindingExpression(ComboBox.TextProperty).UpdateTarget();

  发现果然是在Text赋值后就会清空TextProperty的数据绑定。为了查看在哪里清除,我用了在下载.Net4 Framework源码,查找OpenExpressApp中DataGrid枚举值更新错误的原因中介绍的方法,逐步调试到DependencyObject单元,发现执行到一段代码,具体代码还没有太看明白,我估摸着是清空绑定,如果有谁清晰的话回复一下吧。

 

                // detach the old expression, if applicable 
                if (currentExpr != null)
                { 
                    // CALLBACK 
                    DependencySource[] currentSources = currentExpr.GetSources();
 
                    UpdateSourceDependentLists(this, dp, currentSources, currentExpr, false);  // Remove

                    // CALLBACK
                    currentExpr.OnDetach(this, dp); 
                    currentExpr.MarkDetached();

                    entryIndex = CheckEntryIndex(entryIndex, dp.GlobalIndex); 
                }

解决问题

  既然知道了原因是TextBinding被清空了,那么剩下的就是我们如何在框架中处理了,解决这个问题很简单,每个属性编辑器都有一个View对象,那么我们只要在每次切换列表时重新绑定一次就好了,修改代码如下:

        public LookupListPropertyEditor(BusinessObjectPropertyInfo propertyInfo, IObjectView view)
            : base(propertyInfo, view) 
        {
            this.View.CurrentObjectChanged += new EventHandler(View_CurrentObjectChanged);
        }


        void View_CurrentObjectChanged(object sender, EventArgs e)
        {
            CreateTextBinding();
        }

        //由于直接对ComboBox.Text直接赋值,导致TextBinding Detach,所以需要手动新增绑定
        private void CreateTextBinding()
        {
            if (_cmbGrid == nullreturn;
            var bindExpr = this._cmbGrid.GetBindingExpression(ComboBox.TextProperty);
            if (bindExpr == null)
            {
                Binding textBinding = new Binding();
                this.PrepareBinding(textBinding);
                PrepareBinding(textBinding);
                this._cmbGrid.SetBinding(ComboBox.TextProperty, textBinding);
            }
            else
                bindExpr.UpdateTarget();
  }

知识点

  解决问题后,在《WPF揭秘》一书196页中发现写到:

另一种清除绑定的方式是直接为目标属性设置一个新的值,例如: currentFolder.Text = "I am no longer receiving updates."

但要注意:这仅是清除单向绑定

回顾

  1. 对于未知问题,可以通过现象猜测可能出现的点
  2. 如果项目本身复杂不易调试,可以针对问题点做一个简答Demo来验证问题点的猜测是否正确
  3. 通过.Net框架源码逐步调试可以看到内部代码执行流,比使用Reflector查看静态代码方便好用

 






 本文转自 jingen_zhou 51CTO博客,原文链接:http://blog.51cto.com/zhoujg/517966,如需转载请自行联系原作者


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
从Hadoop到ClickHouse,现代BI系统有哪些问题?如何解决?
导读:一次机缘巧合,在研究BI产品技术选型的时候,我接触到了ClickHouse,瞬间就被其惊人的性能所折服。这款非Hadoop生态、简单、自成一体的技术组件引起了我极大的好奇。那么ClickHouse好在哪呢?本文带你做一个初步了解。
1333 0
移动端信息无障碍技术方案全解:以手淘为例
目前中国有1700多万视障人士,他们渴望购物,也希望在任何情况下都能平等的获取他们想要的信息,手淘作为全国最大的购物 App,我们也希望通过技术让视障消费者能更好的享受移动互联带来的便利,这既是公益,也是义务。 本文将和大家分享手淘在使用 DinamicX 支持无障碍的技术方案,并给出了相关示例,希望对移动端开发者有所启发。
51 0
跨地域场景下,如何解决分布式系统的一致性?
跨地域,即常说的“异地双活”、“异地多活”中的异地概念。在业务发展较快的情况下,我们的服务便需要跨地域部署,以满足各区域就近访问和跨地域容灾等需求,在此过程中,不可避免会涉及到跨地域下的分布式一致性问题。由跨地域所带来的网络延迟问题,以及由于网络延迟而衍生的一系列问题,对于设计和构建一个跨地域分布式一致性系统是极大的挑战,业界有很多针对此问题的解决方案,都希望能解决跨地域场景下的一致性问题。
1203 0
短视频app开发,短视频系统发展的收益方式是什么?
 时间一转眼来到了2020年底,短视频仍然是当前移动互联网发展中重要的娱乐方式之一,与直播系统不同,短视频APP开发最初垄断的领域比直播系统多,现在所涉及的广泛领域成为了短视频APP开发的重要优势。从其他行业引进短视频开发,以及当前短视频开发的流量优势可以看出短视频的受欢迎程度,短视频开发也有自己的独特收益方式。
56 0
找优质的直播软件开发公司不用担心系统架构问题
文章标题中提到的系统架构问题,在直播软件开发过程中也是非常重要的一部分。为什么这么说呢?我们举个简单的例子,一个施工队盖楼肯定先要把整体的框架用钢筋扎好,然后再进行下一步的工作。开发直播软件也是一样,先把整体的架构设计好罗列出来,再把其中的功能挨个添加进去。
918 0
一文读懂 Serverless,将配置化思想复用到平台系统中
搭建一个 aPaaS 平台是需要很长时间的,当然也可以基于一些公有云产品的 Serverless 方案实现现有系统的灵活性与扩展性,从而实现针对于不同客户的定制。
1834 0
外部配置属性值是如何被绑定到XxxProperties类属性上的?--SpringBoot源码(五)
外部配置属性值是如何被绑定到XxxProperties类属性上的?--SpringBoot源码(五)
560 0
[内容协作平台] 快速搭建一个数据分发系统
本篇讲介绍如何基于CCP搭建一个数据分发系统。 1. 创建域实例 域(domain):是一个独立的资源空间,比如一个分发系统或一个网盘系统。 (1) 登录CCP官网控制台,创建一个域实例。 点击"创建域"按钮, 数据存储方式,选择 OSSPath: 2. 创建OSS Bucket 打开OSS控制台: https://oss.console.aliyun.com (1) 新建bucket OSS Bucket 区域可以选择任意区域,不一定要和CCP的区域一致。
2709 0
探讨一下如何打造稳定的报名系统之考务管理报名系统开发设计浅谈
首先,标题已注明是浅谈,也就不会太高深,适合各种技术类、非技术类人员参阅。由于才疏学浅,可能存在不到之处,还请大神指正,勿喷、谅解。
146 0
21119
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载
《2021云上架构与运维峰会演讲合集》
立即下载