我是MVVM的新手,我希望有人可以为我澄清一些事情。我需要一个在主视图中显示日期的标签。
我制作了一个模型类“Date”:
public class Date
{
DateTime _date;
public DateTime Date { get { return _date; } }
}
我是否需要为Date创建一个ViewModel,然后将其传递给MainViewModel?我可以直接在MainViewModel中使用Date
或者这是个坏主意吗?
如果是这种情况,每个模型是否都需要自己的ViewModel,即使它只在主ViewModel中使用?或者还有另一种方法可以解决这个问题吗? “日期”甚至需要成为自己的模型吗?
任何建议或提示将不胜感激。对不起,对于大量的问题;我的目标是学习如何正确有效地实现MVVM。
答案 0 :(得分:2)
根本不需要每个类的viewModel。 只需正确实现InotifyPropertyChanged并在mainviewModel中设置模型实例。
Date不需要它自己的模型,只需在实现propertyChanged事件的属性中设置它。
private DateTime _Date;
public DateTime Date
{
get { return _Date; }
set
{
if (value != _Date)
{
_Date = value;
RaisePropertyChanged(() => Date);
}
}
}
答案 1 :(得分:2)
模型和ViewModel之间不需要1对1的关系。 ViewModel的目的是以View所需的方式公开需要绑定到View的东西。这可以是内置类型的简单属性,如bool和DateTime,也可以是复杂的结构(如您自己的模型中的类型)。
我会说Date已经是自己的模型。它模拟了日期和时间。时间给你。你自己没有创建结构。只需将Date属性直接放在MainViewModel上即可使用它。
答案 2 :(得分:2)
模型不需要视图模型。但是,如果模型是在UI上呈现数据的基础,那么viewmodel将需要保存该模型的实例。最好不要使用Date模型,只需在viewmodel中保存DateTime属性即可。你的问题是基于一个非常简单的例子来真正给你建议所以也许我可以指出你可以获得更广泛信息的地方。
此代码项目项目可以帮助您了解有关如何设计当前解决方案的更多信息 http://www.codeproject.com/Articles/100175/Model-View-ViewModel-MVVM-Explained
它展示了模型和视图模型如何交互的一个很好的例子,并希望有助于您理解这个概念
答案 3 :(得分:1)
如果日期属于主(父)视图,只需将其作为属性合并到MainViewModel中,稍后您将视图绑定到该属性。我没有看到为Date创建新类的原因,我们已经在.NET中有一个
如果您需要更新时间(如数字时钟),只需通过异步更新成员并通过实施OnPropertyChanged
将更改传播到View来执行此操作。
ViewModel是模型和视图之间的中介。它可以将您的数据(模型)转换为以后通过视图呈现的方式。这对你有意义吗?对于一个视图,您通常最终会得到一个视图模型,但这并不意味着您必须拥有确切数量的模型。您可以拥有10个模型,只有一个视图具有单个视图模型,这无关紧要。 MVVM是关于分离的,它并不意味着你有1/1/1的情况。
此外,Model
是多个事物的抽象术语。它不仅意味着entity
类,而且几乎所有不依赖于UI的东西(数据访问,业务逻辑,服务......)
关于这个主题的意见不同,但我理解MVVM是这样的:
你们之间有一些类和一些逻辑,它们可以创建你的核心结构。它通常包含数据访问和一些服务。然后您决定需要一些UI,因此您将使用视图作为演示媒体,但您需要填补应用和UI之间的空白。这里是viewmodels,这是他们的角色。
这对你有意义吗?
答案 4 :(得分:0)
ViewModel只是视图的模型。这是代表。 VIewModel使用模型中的数据将其绑定到View。每个View都应该有ViewModel,但不是Model和ViewModel的情况。在您的情况下,MainView只有一个MainViewModel。 在MainViewModel中你会写这样的东西:
private Date myDate;
public Date MyDate{get{return myDate;}}
在MainViewModel中,您只需绑定到MyDate属性即可。您可以看到MainViewModel使用Date Model类创建属性并将View绑定到它。 答案是,你不需要每个Model类的ViewModel。