如何在复杂的屏幕上避免数据绑定/事件地狱?

lah*_*rah 11 c# architecture data-binding wpf winforms

这更像是一个架构/设计问题.

我曾经遇到过一些用WPF/Windows Forms等编写过的项目,这些项目具有很多字段的复杂屏幕,这些字段相互连接(它们的值相互依赖,涉及一些逻辑).

这些项目在我们实施之后就已经开始了,我发现很多事件/数据绑定地狱 - 我的意思是因为所有这些字段都依赖于其他字段,所以他们实现了INotifyPropertyChanged,其他字段被修改为结果.这会导致相同的字段在屏幕加载时更新5-6次,并且填充字段的顺序会导致可怕的错误.(例如,在作业类型之前设置了日期,而不是在作业类型之后,因此我最终得到了不同的工作费.)

更糟糕的是,一些黑客在UI事件上实现(例如,DropDown更改为更新字段X),而其他黑客则在UI绑定的域模型中.

基本上,这是一个巨大的混乱,我只是想知道实现这样的事情的最佳方式是,如果我是从头开始.或者首先避免这么复杂的屏幕是个好主意?

Fed*_*gui 0

我们有相当复杂的 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 绑定功能简直就是一个笑话。这可能就是你在这些项目中看到那些可怕的混乱的原因吗?