Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XAML(Silverlight&;WPF)与MVVM组合的复杂UI_C#_Wpf_Silverlight_Architecture - Fatal编程技术网

C# XAML(Silverlight&;WPF)与MVVM组合的复杂UI

C# XAML(Silverlight&;WPF)与MVVM组合的复杂UI,c#,wpf,silverlight,architecture,C#,Wpf,Silverlight,Architecture,我开始重新设计(软件设计)基于XAML的应用程序,我在两个月前写道。我认为我在开发过程中犯了很多架构错误,导致应用程序的UI部分很难扩展、维护,代码也很难理解。我的应用程序是用MVVM风格的PRISM 4编写的,但尽管PRISM是为模块化设计而发明的,我的应用程序却非常单一。我将继续在新设计中使用PRISM 4,但这次我想将应用程序的UI部分分解为更小、可重用、可扩展的构建块 假设我们正在设计数据输入表单,顶部的容器包含Save、Cancel按钮和TabControl,其中包含2-3个包含大量分

我开始重新设计(软件设计)基于XAML的应用程序,我在两个月前写道。我认为我在开发过程中犯了很多架构错误,导致应用程序的UI部分很难扩展、维护,代码也很难理解。我的应用程序是用MVVM风格的PRISM 4编写的,但尽管PRISM是为模块化设计而发明的,我的应用程序却非常单一。我将继续在新设计中使用PRISM 4,但这次我想将应用程序的UI部分分解为更小、可重用、可扩展的构建块

假设我们正在设计数据输入表单,顶部的容器包含Save、Cancel按钮和TabControl,其中包含2-3个包含大量分组输入控件的选项卡

我可以看到两种完全不同的UI设计方法:静态(编译时)和动态(运行时)。静态是指在编译之前预定义UI,即使用XAML中定义的列的DataGrid。动态是指在运行时编写UI,即在XAML中定义DataGrid,但在运行时根据用户属性添加列

当您决定使用哪种方法时,您使用什么规则,静态还是动态?在这个例子中,你会选择什么

下一个大问题是如何将UI分解成碎片

定义UserControls时使用什么规则,如何定义此示例表单的UserControls?现在关于ViewModels,您是为这个示例表单创建单个VM还是创建多个VM(解释)?当ViewModel包含其他ViewModel(不是简单的模型包装器,而是包含逻辑的真实VM)时,您会怎么想

现在最难的问题至少对我来说是这样。扩展UI构建块(用户控件和视图模型)

当您需要创建某个表单的副本,但界面和|或逻辑稍有不同时,这种情况非常常见,尤其是当您需要在UI中集成授权(权限)时。假设我们需要支持略有不同的out示例表单版本(不管到底有多少版本,假设2-6)

我可以想出以下方法来解决这个问题:

  • 从(usercontrols和viewModels)创建完整的副本并修改它们(静态方式)。好的方面是所有变体都是独立的,具有很大的灵活性,没有依赖性,坏的方面是代码重复,如果您需要更改所有变体中的某些内容,那么您很可能需要在任何地方都对其进行修改,尤其是使用ViewModels

  • 条件呈现,您可以向ViewModel添加大量条件代码,如IsThisVisible、IsHatDisabled(动态方式)。好的方面是最大限度地重用代码,坏的方面是代码膨胀和混乱。您的代码将很难理解和维护

  • 将UI分解为非常小的原子用户控件,从该UI片段组成单独的表单变体,并将ViewModel继承与虚拟成员和覆盖一起使用。我从未使用过ViewModels的继承,我想听听您对这个问题的看法


  • n。其他我想不起的方法。

    根据我的经验,开发路径往往是这样的:

  • 使用Blend或Kaxaml或其他工具设计视图,以及支持该视图的视图模型
  • 认识到视图的某些部分需要是动态的。在视图模型中实现标志,并在视图中实现样式以显示/隐藏它们
  • 意识到所有的旗帜都失去了控制。去掉标志,重构视图以显示用户控件的集合,重构视图模型以动态填充视图模型的集合
  • 有时候,我很早就知道我需要使用方法3,我从一开始就为它设计

    但WPF和MVVM的优点之一是,即使我从一开始就没有为此进行设计,如果环境需要,朝着这个方向发展也不太困难。将一组视图模型属性重构为单个视图模型集合并不需要花费太多的时间或精力


    不过,我可以告诉你:制作一个XAML对象的副本并对其进行编辑会让klaxons在我的脑海中发出声音。可以想象在什么情况下这样做是可以的,但这不是打赌的方式。

    谢谢你分享你的经验,我第一次尝试设计我正在进行的项目在第3步失败了。