MVVM——面试问题


模型、视图、ViewModel(MVVM 模式)旨在指导您如何组织和构建代码以编写可维护、可测试和可扩展的应用程序。

模型- 它只是保存数据,与任何业务逻辑无关。

ViewModel - 它充当模型和 ViewModel 之间的链接/连接,并使东西看起来很漂亮。

视图- 它只是保存格式化的日期,本质上将所有内容委托给模型。

关键的好处是允许视图和模型之间真正分离,而不仅仅是实现分离以及由此获得的效率。它的实际含义是,当您的模型需要更改时,可以轻松更改它,而无需视图,反之亦然。

应用 MVVM 会产生三件关键的事情:

  • 可维护性
  • 可测试性
  • 可扩展性
  • 有些人认为对于简单的 UI,MVVM 可能有点大材小用。
  • 同样,在更大的情况下,设计 ViewModel 可能会很困难。
  • 当我们有复杂的数据绑定时,调试会有点困难。

一般来说,模型是最容易理解的。它是支持应用程序中的视图的客户端数据模型。

  • 它由具有属性的对象和一些变量组成,以在内存中包含数据。

  • 其中一些属性可能引用其他模型对象并创建对象图,该对象图作为一个整体是模型对象。

  • 模型对象应该引发属性更改通知,这在 WPF 中意味着数据绑定。

  • 最后一个责任是验证,这是可选的,但您可以通过 INotifyDataErrorInfo/IDataErrorInfo 等接口使用 WPF 数据绑定验证功能,将验证信息嵌入到模型对象上。

视图的主要目的和职责是定义用户在屏幕上看到的内容的结构。该结构包含静态和动态部分。

  • 静态部件是定义视图组成的控件和控件布局的 XAML 层次结构。

  • 动态部分就像定义为视图一部分的动画或状态更改。

  • MVVM 的主要目标是视图中不应该有任何代码隐藏。

  • 鉴于您至少需要构造函数和调用来初始化组件。

  • 事件处理、操作和数据操作逻辑代码不应位于视图的后面代码中。

  • 还有其他类型的代码必须位于需要引用 UI 元素的任何代码后面的代码中。它本质上是视图代码。

  • ViewModel是MVVM应用的要点。ViewModel 的主要职责是向视图提供数据,以便视图可以将该数据显示在屏幕上。

  • 它还允许用户与数据交互并更改数据。

  • ViewModel 的另一个关键职责是封装视图的交互逻辑,但这并不意味着应用程序的所有逻辑都应该放入 ViewModel 中。

  • 它应该能够处理适当的调用顺序,以便根据用户或视图上的任何更改发生正确的事情。

  • ViewModel 还应该管理任何导航逻辑,例如决定何时导航到不同的视图。

有两种构建视图的方法。您可以使用其中任何一个。

  • 在 XAML 中查看第一个构造
  • 查看代码隐藏中的第一个构造

一种方法是简单地将 ViewModel 添加为 DataContext 属性的 setter 中的嵌套元素,如以下代码所示。

<UserControl.DataContext> 
   <viewModel:StudentViewModel/> 
</UserControl.DataContext>

另一种方法是,您可以通过在视图后面的代码中自行构造视图模型(通过使用实例设置 DataContext 属性)来进行视图优先构造。

通常,DataContext 属性是在视图的构造函数方法中设置的,但您也可以将构造推迟到触发视图的 Load 事件。

using System.Windows.Controls;

namespace MVVMDemo.Views { 
   /// <summary> 
      /// Interaction logic for StudentView.xaml 
   /// </summary> 
	
   public partial class StudentView : UserControl { 
      public StudentView() { 
         InitializeComponent(); 
         this.DataContext = new MVVMDemo.ViewModel.StudentViewModel(); 
      } 
   } 
}

在代码隐藏而不是 XAML 中构造 ViewModel 的主要原因是视图模型构造函数需要参数,但 XAML 解析只能构造默认构造函数中定义的元素。

ViewModelLocator 提供了一种标准的、一致的、声明性的和松散耦合的方式来进行视图优先构建,从而自动执行将 ViewModel 连接到视图的过程。以下是 ViewModelLocator 的高级流程。

视图模型定位器
  • 找出正在构建的视图类型。
  • 识别该特定视图类型的 ViewModel。
  • 构造该 ViewModel。
  • 将视图 DataContext 设置为 ViewModel。

数据绑定是 MVVM 区别于其他 UI 分离模式(如 MVC 和 MVP)的关键功能。

数据绑定可以是 OneWay 或 TwoWay,以便在 View 和 ViewModel 之间来回流动数据。

隐式数据模板可以自动从当前资源字典中为使用数据绑定的元素选择合适的模板。他们根据数据绑定呈现的数据对象的类型来执行此操作。首先,您需要有一些绑定到数据对象的元素。

命令模式中有两个主要参与者,调用者和接收者。

祈求者

Invoker是一段可以执行一些命令式逻辑的代码。通常,它是用户在 UI 框架上下文中与之交互的 UI 元素。但它可能只是应用程序中其他地方的另一块逻辑代码。

接收者

接收者是在调用者触发时执行的逻辑。在 MVVM 上下文中,接收器通常是 ViewModel 中需要调用的方法。

在调用者和接收者之间有一个阻塞层,不允许调用者和接收者明确地了解彼此。这通常表示为暴露给调用者的接口抽象,并且该接口的具体实现能够调用接收者。

不,如果内容块仅提供将某些内容渲染到屏幕上的结构,并且不支持用户对该内容的任何输入或操作。它可能不需要单独的 ViewModel,但它可能只是一个基于父 ViewModel 公开的属性进行渲染的块 XAML。

当您的应用程序开始接受最终用户的数据输入时,您需要考虑验证该输入。确保它符合您的总体要求。

您可以使用 WPF 数据绑定支持的以下表达验证的方式 -

  • 设置对属性抛出异常。
  • 实现 IDataErrorInfo 接口。
  • 实现 INotifyDataErrorInfo。
  • 使用 WPF 验证规则。

控制反转 (IoC) 和依赖项注入是两种密切相关的设计模式,容器基本上是为您执行这两种模式的基础设施代码块。IoC 模式是关于委派构建责任,而依赖注入模式是关于向已构建的对象提供依赖项。

事件是一种对状态变化做出反应的编程结构,通知任何已注册通知的端点。事件主要用于通知用户通过鼠标和键盘输入,但它们的用途并不限于此。每当检测到状态更改时,也许当对象已加载或初始化时,就可以触发事件以警告任何感兴趣的第三方。