2

我是 MVVM 的新手,我希望有人可以为我澄清一些事情。我需要一个在我的主视图中显示日期的标签。

我做了一个模型类“日期”:

public class Date
{
    DateTime _date;
    public DateTime Date { get { return _date; } }
}

我是否需要为 Date 创建一个 ViewModel,然后将其传递给 MainViewModel?我可以Date直接在 MainViewModel 中使用还是不是一个好主意?

如果是这种情况,是否每个模型都需要自己的 ViewModel,即使它只在主 ViewModel 中使用?或者还有其他方法可以解决这个问题吗?“日期”甚至需要成为自己的模型吗?

任何建议或提示将不胜感激。抱歉,问题的洪流;我的目标是学习如何正确有效地实现 MVVM。

4

5 回答 5

2

您根本不需要每个班级的 viewModel。只需正确实施 InotifyPropertyChanged 并在 mainviewModel 中设置模型实例。

Date 不需要它自己的模型,只需将其设置在实现 propertyChanged 事件的属性中。

private DateTime _Date;
public DateTime Date
{
   get { return _Date; }
   set 
   { 
      if (value != _Date)
      {
         _Date = value;
         RaisePropertyChanged(() => Date);
      }
   }
} 
于 2013-05-30T15:19:09.497 回答
2

您不需要模型和视图模型之间的一对一关系。ViewModel 的目的是以 View 需要的方式暴露需要绑定到 View 的东西。这可以是 bool 和 DateTime 等内置类型的简单属性,也可以是复杂的结构(如您自己的模型中的类型)。

我会说 Date 已经它自己的模型。它为您模拟日期和时间。您只是没有自己创建结构。只需将 Date 属性直接放在 MainViewModel 上并使用它。

于 2013-05-30T15:19:09.610 回答
2

模型不需要视图模型。但是,如果模型是在 UI 上呈现数据的基础,那么视图模型将需要保存该模型的实例。完全没有 Date 模型并在视图模型中保留 DateTime 属性甚至可能会更好。您的问题基于一个过于简单的示例,无法真正为您提供建议,所以也许我可以为您指出一个可以获得更广泛信息的地方。

此代码项目项目可以帮助您了解有关如何设计当前解决方案的更多信息 http://www.codeproject.com/Articles/100175/Model-View-ViewModel-MVVM-Explained

它展示了模型和视图模型如何交互的一个很好的例子,希望能帮助你理解这个概念

于 2013-05-30T15:20:23.443 回答
1

如果日期属于主(父)视图,只需将它作为属性合并到 MainViewModel 中,稍后您将绑定视图。我没有理由为 Date 创建一个新类,我们在 .NET 中已经有了一个。
如果您需要更新时间(如数字时钟),只需通过异步更新成员并通过实现将更改传播到视图来完成OnPropertyChanged

ViewModel 是模型和视图之间的中介。它可以将您的数据(模型)转换为以后可以通过视图呈现的方式。这对你有意义吗?您通常会以一个视图模型结束一个视图,但这并不意味着您必须拥有确切数量的模型。您可以拥有 10 个模型,并且只有一个视图具有单个视图模型,这无关紧要。MVVM 是关于分离的,这并不意味着你有 1/1/1 的情况。

此外,Model它是多种事物的抽象术语。它不仅意味着entity类,而且几乎所有不依赖于 UI 的东西(数据访问、业务逻辑、服务......)

关于这个话题的意见不同,但我对 MVVM 的理解是这样的:

您有一些类和它们之间的一些逻辑,它们创建了您的核心结构。它通常包含数据访问和一些服务。然后你决定你需要一些 UI,所以你将使用 Views 作为呈现媒体,但是你需要填补你的应用程序和你的 UI 之间的空白。视图模型来了,这就是它们的作用。

这对你有意义吗?

于 2013-05-30T15:09:21.480 回答
0

ViewModel 只是视图的模型。它是代表。VIewModel 使用模型中的数据将其绑定到视图。每个 View 都应该有它的 ViewModel,但 Models 和 ViewModel 不是这样。在您的情况下,MainView 只有一个 MainViewModel。在 MainViewModel 你会写这样的东西:

private Date myDate;
public Date MyDate{get{return myDate;}}

在 MainViewModel 中,您只需绑定到 MyDate 属性。您可以看到 MainViewModel 使用 Date Model 类创建了一个属性,并且 View 绑定到它。答案是否定的,您不需要每个模型类的 ViewModel。

于 2013-05-30T23:01:48.203 回答