MVVM - 面试问题

模型,视图,ViewModel(MVVM模式)都是为了引导你进入如何组织和构造代码以编写可维护,可测试和可扩展的应用程序.

模型 : 它只保存数据,与任何业务逻辑无关.

ViewModel : 它充当Model和ViewModel之间的链接/连接,使东西看起来很漂亮.

查看 : 它只保存格式化的日期,并基本上将所有内容委托给模型.

关键的好处是允许视图和模型之间的真正分离,除了实现分离和从中获得的效率.实际意义上说,当你的模型需要改变时,它可以很容易地改变而不需要观察,反之亦然.

有三个关键的东西流出来应用MVVM :

  • 可维护性

  • 可测试性

  • 可扩展性

  • 有些人认为对于简单的用户界面来说,MVVM可能是一种过度杀伤.

  • 同样在更大的情况下,设计ViewModel可能很困难.

  • 当我们有复杂的数据绑定时,调试会有点困难.

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

  • 它由具有属性和某些属性的对象组成用于在内存中包含数据的变量.

  • 其中一些属性可能引用其他模型对象并创建整体为模型对象的对象图.

  • 模型对象应引发属性更改通知,在WPF中表示数据绑定.

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

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

  • 静态部分是XAML层次结构,它定义控件的控件和布局.视图由...组成.

  • 动态部分类似于动画或状态更改,定义为视图的一部分.

  • MVVM的主要目标是视图中不应该有代码.

  • 在视图中你至少需要构造函数和初始化组件的调用.

  • 事件处理,操作和数据操作逻辑代码不应该在View中的代码中.

  • 还有其他类型的代码必须包含在引用UI元素所需的任何代码后面的代码中.它本质上是查看代码.

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

  • 它还允许用户与之交互数据和更改数据.

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

  • 它应该能够处理适当的调用顺序,以便根据用户或任何更改来实现正确的事情.查看.

  • ViewModel还应管理任何导航逻辑,例如决定何时需要导航到其他视图.

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

  • 查看XAML中的第一个构造

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

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

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

另一种方法是你可以通过在View的后面代码中自己构建视图模型来查看第一个构造,方法是在其中设置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的高级过程.

ViewModelLocator
  • 找出正在构建的View类型.

  • 识别特定View类型的ViewModel.

  • 构造ViewModel.

  • 将Views DataContext设置为ViewModel.

数据绑定是将MVVM与其他UI分离模式(如MVC和MVP)区分开来的关键功能.

数据绑定可以是OneWay或TwoWay,以便在View和ViewModel之间来回传输数据.

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

命令模式中有两个主要的角色,即调用者和接收者.

Invoker

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

接收器

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

在调用者和接收者之间你有一个障碍层,不允许调用者和接收者明确地知道关于彼此.这通常表示为向调用者公开的接口抽象,并且该接口的具体实现能够调用接收者.

不,如果内容块仅提供向屏幕呈现内容的结构,并且不支持用户对该内容的任何输入或操纵.它可能不需要单独的ViewModel,但它可能只是一个基于父类ViewModel公开的属性呈现的块XAML.

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

你可以使用以下表达WPF数据绑定和减号支持的验证方式;

  • 设置属性上的抛出异常.

  • 实现IDataErrorInfo接口.

  • 实现INotifyDataErrorInfo.

  • 使用WPF验证规则.

控制反转(IoC)和依赖注入是两个密切相关的设计模式和容器基本上是一大堆基础设施代码,可以为您完成这两种模式. IoC模式是关于委托构造的责任,依赖注入模式是关于为已经构建的对象提供依赖关系.

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