c# – 寻找太多房产变化的替代方案
我正在开发一个
WPF应用程序,我必须根据其他视图模型(ChildModel)的集合对viewmodel(GroupedViewModel)进行分组.
视图模型和属性更改的集合: ObservableCollection<ChildModel> chlidModelCollection; //initialize child model childModel.PropertyChanged += OnChildModelPropertyChanged public void OnChildModelPropertyChanged(object sender,PropertyChangedEventArgs args) { //try grouping GroupViewModel //do some tasks which takes little over time } 由于Child Viewmodel有10个属性,因此对属性的任何更改都会调用OnChildModelPropertyChanged 10次.对于集合中10个子模型的集合,OnChildModelPropertyChanged称为10 * 10 = 100次.这会影响性能. 对于子视图模型集合中的所有属性更改,是否有一种方法可以获取聚合或最终变更集.我错过了什么吗? 解决方法
不要做任何昂贵的事情来回应这些事件
如果它们只是更改视图和视图模型中的值,即使这些值正在为模型对象赋值,您可能正在实现“保存更改”,这会执行一些昂贵的操作,例如对数据库的I / O或与服务的网络连接. 或者,您可以更改其他属性以响应用户事件,例如,其他适用项的启用或可见状态. 不幸的是,如果你只是把这些东西拿出来,你的应用就会破产.继续阅读替代方案…… UI更改的解决方案 如果您可以更改UI,请添加“保存”按钮以推迟IO /网络事件,直到用户准备执行此操作.这是一个相当令人讨厌的选择. 相同的解决方案 – 但没有UI更改 您也可以设置一个“脏”标志,并通过计时器每10秒自动保存一次,并在表单关闭时自动保存.这样可以减少干扰. 只有在真正发生变化时才能保存 当然,自动绑定将自动绑定.但是,如果您的对象结构允许检测更改并将原始值与更改的值进行比较,而没有一百万行猴子代码,请考虑推迟昂贵的操作,除非确实发生了变化.当然,用户不可能一次更改多个字段.你不是傻瓜,所以你知道.我的猜测是加载或添加UI的一部分是触发事件,所以… 在自动更改期间跳过昂贵的操作 如果事件在数据存储的UI填充期间触发,或者用户操作导致许多字段的自动设置,请确保您具有用于标识这些事件的代码.然后设置一个成员变量,该变量对于在执行IO或网络等昂贵的事情之前可以检查的所有UI都是可见的.这些是“应用程序启动”更改,即使它们是响应屏幕上的用户操作. 当应用程序启动的事件完成后,从初始运行的代码调用昂贵的操作一次以响应单个用户启动的事件. 仅从一个方法调用将所有属性mod设置为整个UI (tl;本节的博士 – MVVM的架构分歧使其不那么实用而又不失其优势,但你可能会得到一些好的结果) 当然,这可以是一种调用其他方法的方法,作为最佳实践和重复的UI部分.这是一个哲学上的事情,因为响应屏幕的那一部分的更新可以按不同的顺序发生,如果屏幕的不同部分必须开始彼此交互,则根据业务需求,这就像不同的对象相互影响和副作用爆炸了. 您不会允许使用对象 – 您可以将方法和成员设为私有.不幸的是,在UI上你没有选择. 结果是,由于不同的事件可能以不同的顺序触发,它增加了可靠性/可维护性差的关键指标,以及称为“周期性复杂性”的可调试性 – 因为通过代码存在许多不同的路径. 通常这是由方法中的IF语句引起的.不幸的是,对于事件,它是同样的问题,但隐藏.此外,没有办法用最佳实践对其进行编码.这只是事件驱动的UI编程概念的一个问题(在某种程度上,过度使用SOA中的事件并忘记架构).它适用于事件驱动编程,从VB6到WPF再到JavaScript,Jquery或Angular处理事件. 解决方案是(以某种方式)让所有事件触发,然后只调用一次执行所有UI设置的方法.这需要首先执行逻辑,确定需要在哪些控件,确定触发它们的事件,然后对它们进行额外设置,同时确保在此步骤中,事件不会触发(这将重新运行一切) . 在WPF中执行此操作的问题是绑定发生在响应事件而不是您的控件上.但请注意: 绑定总是好的! 直接响应数据已更改的事件对于复杂的UI(如您的)而言会变坏或者就此而言,任何复杂的系统都会触发并响应异步(或模拟的异步)命令,事件或消息,而不会非常小心地“围墙”以缩小范围的事件. 我不够WPF开发人员知道如何让您的视图更新下游模型而不响应事件. 我们需要的是一个可以由事件启动的生命周期,但只关注一小部分案例,并运行屏幕的所有逻辑,如果任何其他字段发生更改,它将运行.这样做的原因通常是,变化的领域无关紧要.想一想 – 当您从数据源加载UI时,它们输入的方式是否重要?您可以与代码共享任何加载设置代码,以更改屏幕状态以响应数据条目.您需要检查的唯一事件是: 按钮/链接按下这是重点 – 当然你需要知道改变了什么 相互改变的字段,例如假设你让用户退出1000美元的CD.如果您有$amount和%金额,并想要输入$500来刷新%到50,并输入25%来刷新$到$250,你必须知道他们改变哪个字段来修改另一个.你可以猜到 – 模糊不清. 我使用了一个自动绑定的专有框架,允许重要的数据更改启动生命周期,执行相同的UI设置和UI读取/保存,并处理其他简单的事情(如灰色控件和显示验证气球) SDK.每当我被迫使用事件驱动的UI编程来实现任何非平凡的任务时,我都渴望它. MVC网站通过其绑定机制来解决这个问题,但基于页面的网站的自然“后期/响应”周期可以减少响应事件的编码流行程度. 这就是为什么WebForms如此困难 – 它人为地将事件驱动的UI的麻烦强加到一个自然简单的系统的顶部. 当然,对于转向服务的SPA Web应用程序,只需将C#/ WPF-MVVM与JS / Angular MVVM交换即可. MVVM在概念上很酷,层次很好,绑定很酷,它是可以通过大UI获得毛茸茸的事件.对于棘手的商业案例而言,需要大量的UI.你不会看到办公室工作人员在手机上工作.有些人会争辩 – 但他们不是那些支付工资并快速响应客户需求的人;-) 这并不是对事件驱动编程的咆哮.它有它的位置,它只是在更大的实际业务UI案例的重压下崩溃,需要大量支持.我们开发的相当擅长! 在40年后,人们将看待事件驱动的编程,他们看待上帝对象和背景.但如果到那时我们都没有在海滨别墅中退休,我会吃掉我的老鼠! (让我先煮吧) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |