2

我相信 MVVM 的主要好处之一是解耦,绑定和缺乏引用使事情更加可重用。

我发现的所有 MVVM 示例都有某种带有 ViewModel 的 View,其名称ExampleViewExampleViewModel. 并且始终是一对一的关系,一个视图,一个视图模型。

但是在我当前的项目中,我有一个要填写的表单,因此可以将数据添加到数据库中,用户也可以选择编辑数据库上的数据,因此这个表单 View 可以与两个不同的 ViewModel 透明地使用,一种用于添加数据,一种用于编辑数据。我发现复制和粘贴整个 View 只是为了让它以其 ViewModel 命名有点愚蠢,不仅如此,如果我需要更改某些东西,它总是必须加倍工作,并且可能会忘记一些东西。

一些框架有一个 ViewModel 定位器,它将使用相同的命名约定自动将 View 与 ViewModel 绑定,这让我质疑 View 与许多不同 ViewModel 的可重用性。

我的问题基本上是:将一个视图与不同的视图模型一起使用是否有问题?这是不好的做法吗?这种特殊情况是否有任何命名约定?

缺乏可重用性的例子让我质疑这种做法的有效性。

4

3 回答 3

3

没有问题 - 视图是视图模型的知识,但反之则不然。这对你正在做的事情很好。

但是,我会在两个视图模型中创建一个通用绑定属性的接口,然后创建一个视图模型定位器来将实例作为属性公开。这意味着您绑定到实现,但不在乎哪一个。

如何切换该实现取决于您如何实例化视图。

于 2015-04-20T19:42:05.563 回答
2

正如kidshaw回答中所说:

假设NewExampleViewModelEditExampleViewModel共享相同的IExampleViewModel接口(其属性被视图引用)并且您严格不希望违反封装,您可以这样做:

var view = new ExampleView();
...
var NewVM = new NewExampleViewModel(...);
...
view.DataContext = NewVM;
...
  (or)
var EditVM = new EditExampleViewModel(...);
view.DataContext = EditVM;
...

请注意,您不能在视图中使用IExampleViewModelas DesignInstance,如:

<UserControl ...
    d:DataContext="{d:DesignInstance Type=vmi:IExampleViewModel}"

为此,您需要一个具体类型,因此您在定义绑定时没有 IDE 支持。

您可以仅在设计视图时使用NewExampleViewModelor EditExampleViewModelasDesignInstance以获得 IDE 绑定支持,然后出于封装原则将其删除。

于 2015-04-22T10:04:44.403 回答
2

也许您应该使用用户控件而不是视图。

然后,您可以将用户控件嵌入到您的视图中。用户控件不适用于视图模型绑定。它旨在插入其他容器。

在您的情况下,根据您的业务模型的状态,您对此控件有不同的用途。

于 2015-04-20T18:58:35.267 回答