加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 寻找太多房产变化的替代方案

发布时间:2020-12-15 23:40:53 所属栏目:百科 来源:网络整理
导读:我正在开发一个 WPF应用程序,我必须根据其他视图模型(ChildModel)的集合对viewmodel(GroupedViewModel)进行分组. 视图模型和属性更改的集合: ObservableCollectionChildModel chlidModelCollection;//initialize child model childModel.PropertyChanged +=
我正在开发一个 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年后,人们将看待事件驱动的编程,他们看待上帝对象和背景.但如果到那时我们都没有在海滨别墅中退休,我会吃掉我的老鼠! (让我先煮吧)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读