lah*_*rah 11 c# architecture data-binding wpf winforms
这更像是一个架构/设计问题.
我曾经遇到过一些用WPF/Windows Forms等编写过的项目,这些项目具有很多字段的复杂屏幕,这些字段相互连接(它们的值相互依赖,涉及一些逻辑).
这些项目在我们实施之后就已经开始了,我发现很多事件/数据绑定地狱 - 我的意思是因为所有这些字段都依赖于其他字段,所以他们实现了INotifyPropertyChanged,其他字段被修改为结果.这会导致相同的字段在屏幕加载时更新5-6次,并且填充字段的顺序会导致可怕的错误.(例如,在作业类型之前设置了日期,而不是在作业类型之后,因此我最终得到了不同的工作费.)
更糟糕的是,一些黑客在UI事件上实现(例如,DropDown更改为更新字段X),而其他黑客则在UI绑定的域模型中.
基本上,这是一个巨大的混乱,我只是想知道实现这样的事情的最佳方式是,如果我是从头开始.或者首先避免这么复杂的屏幕是个好主意?
我们有相当复杂的 UI(包括不同类型的几个相关字段,例如 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}"/>
Run Code Online (Sandbox Code Playgroud)
这消除了“初始值”问题,因为 Binding 读取的初始值实际上是来自 Model 的真实值,因此放置在 中的逻辑Setter仅在需要时才执行。
然后,对于虚拟属性(背后没有逻辑),我们直接从视图绑定到模型:
<TextBox Text="{Binding Model.SomeRegularProperty}"/>
Run Code Online (Sandbox Code Playgroud)
这减少了 ViewModel 中的膨胀。
对于后面代码中的事件,我完全避免这样做。我的文件背后的代码几乎总是一个InitializeComponent(),没有别的。
当特定于视图的逻辑无法直接在 XAML 中完成,或者在代码中更容易完成时(大多数情况并非如此),仅将特定于视图的逻辑放置在后面的代码中(例如动画等)。
编辑:
值得一提的是,与基于 XAML 的绑定功能相比,winforms 绑定功能简直就是一个笑话。这可能就是你在这些项目中看到那些可怕的混乱的原因吗?
| 归档时间: |
|
| 查看次数: |
550 次 |
| 最近记录: |