用于复杂应用程序的WPF MVVM

时间:2015-11-06 08:38:53

标签: c# wpf mvvm

我正处于具有复杂要求的WPF应用程序的设计阶段: 我必须通过代码控制视图,因为我必须根据用户权限启用,禁用或隐藏元素。此外,在TreeView中,我必须根据Item-Type(内部逻辑)和用户权限的依赖性来控制TreeViewItems的ContextMenu。 要显示的数据由存储过程提供给数据集(多个表)。 MVVM和维护的经验是什么(MVVM的代码复杂性与后面的直接代码相比)以及所有控制可见性的提升。

不需要自动测试,因为可见部分必须始终包含在测试中(控件的可见性取决于加载的数据)

欢迎任何消费

3 个答案:

答案 0 :(得分:2)

进入设计阶段会更容易建议模式和做法,您的问题不是很清楚,所以我会解决您所做的每一点。

  

我必须通过代码控制视图,因为我必须根据用户权限启用,禁用或隐藏元素。此外,在TreeView中,我必须根据Item-Type(内部逻辑)和用户权限的依赖性来控制TreeViewItems的ContextMenu。

这听起来非常简单,在这种情况下使用MVVM设计模式很可能需要IValueConverter将视图模型Boolean属性转换为视图友好Visibility值。 This解释了如何实现这一目标。

  

要显示的数据由存储过程提供给数据集(多个表)。

我建议调查Repository Pattern。这与MVVM设计模式相结合,可以很好地满足您的要求。

  

MVVM和维护的经验(MVVM的代码复杂性与后面的直接代码相比)以及控制可见性的大幅提升。

MVVM的目的不是没有代码隐藏,而是确保代码属于正确的位置。代码隐藏不是一件坏事,它的查看相关代码。有一个更详细的答案here

在您的方案中,您很可能需要在视图模型中使用属性来指示用户是否具有查看某些控件的权限,我假设这些权限保存在数据库中,因此属性将需要住在视图模型中,因为您无法从视图中访问数据库。我希望这是有道理的。

MVVM比代码隐藏解决方案更易于维护,因为您的视图模型与视图分离,因此如果视图更改,视图模型也不一定需要更改。对于存储库和模型也是如此。

MVVM为更多敏捷解决方案铺平了道路。

答案 1 :(得分:0)

我来自winforms世界,并且实现任何MVX样式模式似乎更麻烦但是在使用WPF之后,我可以说MVVM是最好的继续方式。整个机制都是开箱即用的。

首先,关键的好处是它可以实现“视图”与“真实”之间的真正分离。和'模型'。如果/当你的模型需要改变时,它可以在没有视图需要的情况下反过来,反之亦然。

其次,你的模特'可能包含您所查看的所有数据'但您的视图可能需要此数据。以某种其他方式。对于这些转换'查看模型'是必需的,而模型中的重复需要这些更改。

您还可以使用' viewmodel'聚合您的模型中存在于单独的类/库中的部分,以便为“视图”提供更流畅的界面。处理。您不太可能希望以与用户希望或希望向其提供数据相同的方式处理代码中的数据。

最重要的是,您可以获得视图'视图之间的自动双向数据绑定。和' viewmodel'。

我还会在这里推荐视频: http://blog.lab49.com/archives/2650

答案 2 :(得分:0)

你所描述的场景几乎是一个完美契合的场景。用于使用MVVM。只需在视图中使用绑定,即可根据权限控制可见性。你不需要在视图中编写任何代码隐藏(除了你必须做一些特定的UI事情),因为你的"数据"之间的整个连接。 (模型)和显示(视图)在视图模型中完成。 这也增强了可维护性,您可以在不更改视图模型的情况下触摸视图,反之亦然。 一开始它会有点压倒性的,你必须创建许多看起来有点混乱的属性。

简而言之:

  • 查看:只是用户将看到的表单(布局)(显示数据)
  • ViewModel:(在某种程度上)"控制"您的视图并将其与您的数据(模型)连接
  • 模型:您的业务逻辑

例如:在viewmodel中,您可以设置属性的状态,该属性指示控件元素是否对用户可见,然后将此属性绑定到视图。在视图中,除了在XAML代码中绑定属性之外,您什么都不做。这是保持清洁的好方法。

我希望这有点帮助。

编辑:这是quickstart,这里还有一些information