c# - MVVM 中的 ViewModel 是什么

标签 c# wpf mvvm viewmodel

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

6年前关闭。




Improve this question




我花了很长时间在 WPF 中搜索 MVVM。我明白为什么要使用它。这对我来说很清楚。
我不知道的是 ViewModel 本身的内容。我知道这是 View 和模型之间的连接。另外,我知道(至少,大多数程序员的建议)实现了 INotifyPropertyChanged .除此之外,命令。

假设我有这个模型(EF 6 的代码优先):

public class City
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CityId { get; set; }

    [DataType("VarChar"), MaxLength(25), Required]
    public string CityName { get; set; }
}

我的问题是:

1-在我见过的许多示例中,他们在 VM 中再次重新创建了相同的字段。目的是什么,是否足以拥有整个对象(在我的例子中是城市)。如果有很多字段怎么办!

2-为了能够在我的 View (CRUD)中使用它,我的示例中的 CityVm() 将如何?

我很感激任何帮助。

最佳答案

MVVM 模式中的 View 模型封装了 View 的表示逻辑和数据。它没有直接引用 View 或关于 View 的具体实现或类型的任何知识。 View 模型实现了 View 可以数据绑定(bind)到的属性和命令,并通过更改通知事件通知 View 任何状态更改。 View 模型提供的属性和命令定义了 UI 提供的功能,但 View 决定了如何呈现该功能。

View 模型负责协调 View 与所需的任何模型类的交互。通常, View 模型和模型类之间存在一对多的关系。 View 模型可以选择将模型类直接暴露给 View ,以便 View 中的控件可以直接数据绑定(bind)到它们。在这种情况下,模型类需要设计为支持数据绑定(bind)和相关的更改通知事件。

View 模型可以转换或操作模型数据,以便 View 可以轻松地使用它。 View 模型可以定义额外的属性来专门支持 View ;这些属性通常不会成为模型的一部分(或不能添加到模型中)。例如, View 模型可以组合两个字段的值以使 View 更容易呈现,或者它可以计算最大长度字段的剩余输入字符数。 View 模型还可以实现数据验证逻辑以确保数据一致性。

View 模型还可以定义 View 可以用来在 UI 中提供视觉变化的逻辑状态。 View 可以定义反射(reflect) View 模型状态的布局或样式更改。例如, View 模型可以定义一个状态,该状态指示数据正在异步提交给 Web 服务。 View 可以在此状态期间显示动画以向用户提供视觉反馈。

通常, View 模型将定义可以在 UI 中表示并且用户可以调用的命令或操作。一个常见的例子是 View 模型提供了一个提交命令,该命令允许用户将数据提交到 Web 服务或数据存储库。 View 可以选择用按钮来表示该命令,以便用户可以单击按钮来提交数据。通常,当命令变得不可用时,其关联的 UI 表示将被禁用。命令提供了一种封装用户操作并将其与 UI 中的可视化表示清晰分离的方法。

总而言之, View 模型具有以下关键特征:

  • View 模型是一个非可视类,并不派生自任何 WPF 基类。它封装了支持应用程序中的用例或用户任务所需的表示逻辑。 View 模型可独立于 View 和模型进行测试。
  • View 模型通常不直接引用 View 。它实现了 View 可以数据绑定(bind)的属性和命令。它通过 的更改通知事件通知 View 任何状态更改。 INotifyPropertyChanged INotifyCollectionChanged 接口(interface)。
  • View 模型协调 View 与模型的交互。它可以转换或操作数据,以便 View 可以轻松地使用它,并且可以实现模型上可能不存在的其他属性。它还可以通过 实现数据验证。 IDataErrorInfo INotifyDataErrorInfo 接口(interface)。
  • View 模型可以定义 View 可以直观地向用户表示的逻辑状态。
  • 关于c# - MVVM 中的 ViewModel 是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36937210/

    相关文章:

    c# - 自动生成可编译的 C# - 实现 INotifyPropertyChanged 的​​包装类

    c# - 当绑定(bind)属性的值未更改时,是否可以说服 PropertyChangedCallback 运行?

    c# - 格式化DateTime.Now

    c# - FindViewById() 如何工作?

    c# - 带有Enum类型的HashSet的奇数相等结果?

    .net - 为什么我的 TextBox 数据绑定(bind)不起作用?

    WPF MEF + Prism 初始区域加载

    C#到VB.Net的转换,RaiseEvent的烦恼

    c# - 当焦点 WPF 元素被移除时,键盘焦点去哪里了?

    mvvm - 如何根据.net maui 中的条件进行绑定(bind)?