2013-05-30 72 views
2

我是MVVM的新手,我希望有人能为我澄清一些事情。我需要一个标签,在我的主视图中显示日期。MVVM - 关于模型和视图模型的几个问题

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

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

我需要做一个视图模型的日期,然后传递到MainViewModel?我可以直接在MainViewModel中使用Date吗?或者这不是个好主意吗?

如果是这样的话,是否每个模型都需要自己的ViewModel,即使它只能用在主ViewModel中?还是有另一种方式去解决这个问题? “日期”是否需要成为自己的模型?

任何意见或提示将不胜感激。对于问题的洪流感到抱歉;我的目标是学习如何正确高效地实现MVVM。

+0

在MVVM ViewModels绑定到视图,所以你的'Date'模型可以出现在多个ViewModels中。 – Romoku

+0

让我们从头开始:找到这个日期应该是一个属性。创建一个包装单个值的模型看起来不是一个好主意。日期或任何其他标量值本身并不是什么东西;它代表了别的东西的属性。它自行站立是没有道理的。 – Jon

回答

2

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

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

private DateTime _Date; 
public DateTime Date 
{ 
    get { return _Date; } 
    set 
    { 
     if (value != _Date) 
     { 
     _Date = value; 
     RaisePropertyChanged(() => Date); 
     } 
    } 
} 
1

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

ViewModel是模型和视图之间的中介。这是将数据(模型)转换为稍后可以通过视图呈现的方式。这对你有意义吗?您通常会为一个视图最终生成一个视图模型,但这并不意味着您一定需要确切的模型数量。你可以有10个模型,只有一个单一的viewmodel视图,并没有关系。 MVVM是关于分离的,这并不意味着你有1/1/1的情况。

此外,Model是一个有点多抽象的术语。它不仅意味着entity类,但它几乎是所有不依赖于UI(数据访问,业务逻辑,服务..)

意见是不同的这个主题,但我理解MVVM是这样的:

你有一些类和他们之间的一些逻辑,创建你的核心结构。它通常包含数据访问和一些服务。然后你决定你需要一些用户界面,所以你会使用视图作为展示媒体,但你需要填补你的应用程序和你的用户界面之间的差距。这里来了viewmodels,那是他们的角色。

这对你有意义吗?

+0

感谢您的回复。我所知道的MVVM就是我在一些教程和一些示例代码中看到的。这对我来说还是很新的。就我的另一个问题而言,每个模型都需要自己的视图模型吗? –

+0

@ DennisE,已更新。 – walther

2

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

我会说,日期已经是它自己的模型。它为你建模一个日期&。你只是没有自己创建结构。只需将Date属性直接放在您的MainViewModel上并使用它即可。

2

Models不需要viewmodels。但是如果模型是在UI上呈现数据的基础,那么视图模型将需要保存该模型的一个实例。根本没有Date模型可能会更好,只需在视图模型中保存DateTime属性即可。你的问题是基于一个太简单的例子来真正给你提供建议,所以也许我可以指出你在哪里可以得到一些更广泛的信息。

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

它显示的是如何模型和视图模型交互的一个很好的例子,希望将有助于概念的理解

0

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

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

而且在MainViewModel你只绑定到指明MyDate财产。您可以看到,MainViewModel使用Date Model类创建属性,并使用View绑定它。 答案是否定的,你不需要每个Model类的ViewModel。