这更像是一个架构/设计问题。
过去,我遇到过一些用WPF/Windows窗体等编写的项目,这些项目具有复杂的屏幕,有许多字段,这些字段相互连接(它们的值相互依赖,涉及到某种逻辑)。
这些项目是我在实现之后开始的,我发现了很多事件/数据绑定--我的意思是,因为所有这些字段都依赖于其他字段,它们已经实现了INotifyPropertyChanged,其他字段也因此而被修改。这会导致相同的字段在屏幕加载时更新5-6次,而字段的填充顺序会导致可怕的错误。(例如,日期是在“职务类型”之前设置的,而不是在“职务类型之后”设置的,因此我最终会收到不同的职务费。)
更糟糕的是,一些hacks是在UI事件上实现的(例如,DropDown更改为更新字段X),而另一些则在UI绑定到的域模型中。
基本上,这是一个巨大的混乱,我只想知道,如果我要从头开始的话,实现这样的东西最好的方法是什么。还是从一开始就避免这样复杂的屏幕是个好主意?
发布于 2013-05-03 06:38:02
我会尽量将业务逻辑排除在属性设置者之外。
首先,如果一个计算需要几个属性,我会编写一个方法来进行计算,并在适当的时候调用该方法。例如,如果属性值的所有不同组合都有意义,则只需在每个属性的设置器中调用该方法,确保相同的代码在任何一个属性发生更改时运行。如果只能计算属性值的特殊组合,则可以实现命令并让用户决定何时计算结果更改,或者可以通过验证提供反馈,并且只有在组合有效时才计算属性更改。如果有几个相互依赖的属性,我经常使用"ChangeInitiator“变量来表示哪些属性已经更改,因此在计算方法中可以清楚地看到哪些属性负责更改,哪些其他属性应该因此进行更改。基本上,这与在每个属性设置器中执行计算的一部分相同,但我发现,如果关系的不同部分都在一种方法中,它有助于我保持对事物的概述。
在我曾经编写的一个程序中,我定期在后台线程上运行一些计算,所以每当一段需要新计算的数据发生变化时,我就会设置一个标志,并且每一秒左右根据一个计时器执行所有更新。这还可以帮助您更好地理解逻辑,并且避免了对一组相关更改进行多次计算。
关于更改通知,我真的尝试只将它用于UI数据绑定。
发布于 2013-05-03 01:27:48
我们有相当复杂的us (包括几个不同类型的相关字段,例如DataGrid中的一个行),而且MVVM模式对我们非常有用。来自模型并暴露于与复杂逻辑相关的视图的所有属性都由ViewModel中的等效属性“包装”,该属性没有后备字段,而是直接指向模型:
public class SomeComplexViewModel
{
public SomeModel Model {get;set;}
public string SomeCrazyProperty
{
get
{
return Model.SomeCrazyProperty;
}
{
Model.SomeCrazyProperty = value;
//... Some crazy logic here, potentially modifying some other properties as well.
}
}
}
<TextBox Text="{Binding SomeCrazyProperty}"/>这就消除了“初始值”问题,因为绑定读取的初始值实际上是来自模型的实际值,因此只在需要时才执行放在Setter中的逻辑。
然后,对于虚拟属性(没有逻辑支持),我们直接从视图绑定到模型:
<TextBox Text="{Binding Model.SomeRegularProperty}"/>这减少了ViewModel的肿胀。
关于后面代码中的事件,我完全避免这样做。我的文件后面的代码几乎总是一个InitializeComponent(),而不是其他任何代码。
只有特定于视图的逻辑被放在后面的代码中(例如动画之类的东西),当它不能在XAML中直接完成,或者在代码中更容易执行时(大多数情况下都不是这样)。
编辑:
值得一提的是,与基于XAML的绑定功能相比,winforms绑定功能是个笑话。这就是你看到这些项目中那些可怕的混乱的原因吗?
https://stackoverflow.com/questions/16349380
复制相似问题