【问题标题】:MVVM - A few questions on Models and ViewModelsMVVM - 关于模型和视图模型的几个问题
【发布时间】:2013-05-30 15:01:18
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 在 MVVM 中,ViewModel 绑定到 View,所以你的 Date 模型可以出现在多个 ViewModel 中。
  • 让我们从头开始:找出这个日期应该是什么属性。创建一个模型来包装单个值看起来不是一个好主意。日期或任何其他标量值本身并不是什么东西。它代表其他东西的属性。独立存在是没有意义的。

标签: c# mvvm


【解决方案1】:

您根本不需要每个类都有一个 viewModel。 只需正确实现 InotifyPropertyChanged 并在 mainviewModel 中设置模型实例。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        这对你有意义吗?

        【讨论】:

        • 感谢您的回复。我所知道的 MVVM 是我在几个教程和一些示例代码中看到的。这一切对我来说还是很新鲜的。至于我的另一个问题,每个模型都需要自己的视图模型吗?
        【解决方案5】:

        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。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-07
          • 2019-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          相关资源
          最近更新 更多