如何写一个纯正的mvvm(真纯怎么写)

如何写一个纯正的mvvm,真纯怎么写

内容导航:

  • 如何用WPF实现一个最简单的Mvvm示例
  • 如何设置ComboBox 默认选中第一项
  • 什么是MVVM
  • 结合上述材料运用经济生活知识谈谈怎样做一个理智的消费者
  • 一、如何用WPF实现一个最简单的Mvvm示例

    基类NotificationObjectclass NotificationObject:INotifyPropertyChanged
    //ViewModel的基类,作用是通知ViewModels的变化 { public event PropertyChangedEventHandler
    PropertyChanged; public void RaisePropertyChanged(string propertyName) { if
    (hanged!=null) { (this, new PropertyChangedEventArgs(propertyName)); } }
    }简单基类DelegateCommand class DelegateCommand:ICommand{ public
    boolCanExecute(object parameter) { if (eFunc==null) { return true; } return
    eFunc(parameter); } public event EventHandler CanExecuteChanged; public void
    Execute(object parameter) { if (tion==null) { return; } tion(parameter); }
    public ActionExecuteAction { get; set; } public Func CanExecuteFunc { get;
    set; } }ViewModelclass MainWindowViewModel : NotificationObject {
    //以下3个属性是用来做数据传输的数据属性 private double input1; public double Input1 { get {
    returninput1; } set { input1 = value; ertyChanged(“Input1”); } } private
    double input2; public double Input2 { get { returninput2; } set { input2 =
    value; ertyChanged(“Input2”); } } private double result; public double Result
    { get { returnresult; } set { result = value; ertyChanged(“Result”); } }
    //下面这个属性就是用来做操作传输的命令属性 public DelegateCommand AddCommand { get; set; } private
    void Add(objectparameter) { string s = tDirectory(); string s1 = rectory;
    (s+”\r\n”+s1); } //在构造函数中关联命令属性 public MainWindowViewModel() { d = new
    DelegateCommand(new Action(Add)); }//命令属性也可以用以下方式public DelegateCommand
    command1 { get { return new DelegateCommand(new Action(() => (“a”)));} }
    }View在view里,可以在后台绑定如xt = new MainWindowViewModel();也可以在XAML里绑定
    xmlns:viewmodel=”clr-namespace:s”<>

    二、如何设置ComboBox 默认选中第一项

    e=ew;mber=”Name”;er=”id”;ndex=0;string texts=();;string
    values=();但mvvm模式下,就不那么方便了,需要绑定selecteditem,例如:1:2:有没有其它办法呢?很简单,继承combobox,写一个控件,让它默认选中第一项,就解决这个问题了,不用绑定selecteditem。
    =”” 如果你觉得代码好用就拿过去,否则请分享更好的代码。
    <=””
    自定义combobox控件代码如下,也非常简单,思路就是itemsource更新以后就自动默认选中第一行即可:1:publicclasscustomcombobox=””>抢首赞评论0加载更多

    三、什么是MVVM

    答:但其无法与我们的用户进行交互,所以,我们需要为其创建一个界面(视图,View),该视图可以与用户输入设备进行交互,这很棒,但问题是如何将View与我们的model关联起来?Binding便可以发挥作用了,比如视图上的某一个文本框中的文本和Model中的“用户名“关联起来,用户便可以通过操作该文本框来访问和修改Model的“用户名“了。这是极其简单的情况,但实际编程时我们发现,Model中的属性(与方法)往往不那么容易与View中的界面控件关联起来,比如,“类型不匹配“:界面控件所需要的类型与模型中属性提高的类型不匹配.“需要额外操作“:模型中的数据需要经过一些额外的处理才能传给视图,反之亦然.此时,我们意识到View似乎需要一个“Helper“类来处理一些额外工作.这个helper所包含的代码可以放在除了Model外的很多地方(我们现在不考虑贫血富血之类的争论),比如View中,记得自己刚学习窗体程序开发时就是这么干的,将绝大多数处理逻辑放在那个所谓的CodeBehind中.后来,正如大家在各种设计模式书籍中所看到的一样,为了将View和Model剥离开来,实现view可替换(比如你可以讲自己精心设计的软件同时运行于窗体程序,Web甚至Mobile上),便有了MVC.有了MVC以后似乎就开始滋生M-
    V-
    XXX之类的争论与变种模型,比如MVP以及这里的MVVM,甚至MVP也有着SupervisingController与PresentationModel两种方式.但主要围绕两个问题,一是model与view之间的关系,完全隔离的?单向的还是双向的?二是这个“XXX“需要完成哪些功能,简单流程调度?复杂规则处理?OK,这些争论都没有关系,是否采用某种模式取决于你的开发所处的环境(比如语言特性,框架特性)以及你的业务特性以及所面临的主要变化点等等。但与MVC,MVP所不同的是,MVVM的引入不仅仅是技术上的原因(解除耦合应对变化等老生常谈),另外一个很大原因是:软件团队开发方式的改变.如果你做过一段时间的WPF项目开发的话,你可能会有比较明显的感觉:在View层打造上,如何分配程序员和美工的工作.在继续阅读之前,大家可以看看我以前的一篇文章“在UIDesigner与Developer之间“.以前我们团队采用的便是“集成模式“,我便兼职了其中的“Integrator“角色.这还不错.但说实在的,这仅仅是一个在特殊情况下不得已而为之的暂时方案,所以我们付出了很大的努力开始转向“收割模式“了,要转向这个模式,至少需要两个基本条件:(1)你拥有能够熟练运用Blend等工具能为程序员输出XAML的美工,他专注于纯粹的UI/UE,另外他还必须具有一定的“程序员“思维.以便输出的东西能很好地作为程序的一部分而运转起来,而不是仅仅“看上去“是那样的。(2)你需要能够脱离View层但仍能编写出高质量代码的程序员。幸运的是,我们在努力创造条件1,并取得了很好的效果.(你可以招一个具有Flash脚本编写经验的并且有极大的学习热情的美工人员,并对他进行Blend的相关培训).而MVVM模式为我们实现第二个条件提供了极大的便利.为什么MVC/MVP模式不行而MVVM可以呢?很简单,在MVC和MVP模式中,View层都具有很多代码逻辑,开发View层的是程序员,虽然UI/UE团队会做很多工作,但这个层的“实现者“仍然是程序员.在以前的开发中,其工作得很好,而在WPF开发中程序员对View层的展现显得力不从心了,美工(指符合上面条件1的美工)虽然很擅长,但他会说“可惜我不会程序“.于是,我们需要一种方式将View层的代码逻辑抽取出来,并View层很纯粹以便完全让美工去打造它.相应地,需要将View层的相应逻辑抽取到一个代码层上,以便让程序员专注在这里。回想一下,我们只所以要在View(Xaml)背后写一些代码(C#),无非是想传递一些数据以及传递数据时的数据的处理或在用户与界面控件进行交互时执行一些操作,最简单的例子是在MVC中当界面发生交互时View去调用Controler中的某个方法,以便将该操作的相应“指示“传递到“后台“去.在以前的技术中,这样的“衔接性“的代码是必须的.而在WPF中,则可以通过另外的技术来进行层与层之间的“衔接“,这就是“Binding“和“Command“,以及稍后我们会提到的“AttachBehavior“.通过Binding,我们可以实现数据的传递;通过Command,我们可以实现操作的调用.(AttachBehavior的作用稍后再谈).Binding和Command是可以写在XAML中的,这样看来XAML后面对于的CS文件可以被完全抛弃或不予理会了.这样的XAML文件正是美工所需要的.而这些对于Binding以及Command的定义描述以及其他相关信息的代码应该放在那里呢,当然不是View,更不是Model,是“ViewModel“.ViewModel是为这个View所量身定制的,它包含了Binding是所需的相关信息,比如Converter以及为View的Binding提供DataContext,它包含了Command的定义以便View层可以直接使用,另外,它还是一个变种的Controler,它得负责业务流程的调度。于是,便有了这副图,然后,正如“时势造英雄“所言,MVVM就诞生了.3、ViewModel与单元测试如果你是一名正在使用MVVM模式打造软件的程序员,那么我劝你尽快忘掉View.你所面对的是这样一个模式“UnitTest-
    ViewModel-Model“(这并非一个模式,仅仅是我为阐述观点而暂时如此表述的)。记得曾经有一个Model-View-
    AbstractView模式,而MVVM中的VM实际也是一个AbstractView:theabstractionofview.它是一个抽象的View,具有一个View的灵魂,而不具备相应的可视化控件而已.所以对于程序员而已,打造这样一个抽象的VM就可以认为是完成View层的打造了.而当美工完成无数控件组成的实际的View后,我们就可以用Binding和Command这样的黏合剂将这个抽象的View和实际的View黏合在一起了。那么在黏合之前,我们怎么知道自己的VM是否正常工作呢?单元测试!在说明对于ViewModel进行单元测试的重要性之前,送给大家一句话:“ViewandUnitTestarejusttwodifferenttypesofViewModelconsumers“(JoshSmith).如果我们将ViewModel看作生产者,那么View和UnitTest都是具有同等地位的消费者而已.并且UnitTest相比于View而言具备更大的消费能力.或者你可以简单的认为View也仅仅是一种不太推荐的测试方式而已.所以要实施好这个模式,那么对ViewModel的单元测试就是必须的了,并且这个测试要不依赖于任何UI控件.(那么不是不对应ViewModel的开发是不是就应该通过测试来驱动了?TDD?

    四、结合上述材料运用经济生活知识谈谈怎样做一个理智的消费者

    (1)量入为出,适度消费。
    购物要掂量自己的口袋,要在自己的经济承受能力范围之内进行消费。
    (2)避免盲从,理性消费。
    不盲目跟风情绪化消费,重物质消费的同时重视精神消费。
    (3)保护环境,绿色消费。
    “有钱不买半年闲”,要坚持可持续性消费。
    (4)勤俭节约,艰苦奋斗。
    厉行节约,不盲目购买造成资浪费。

    版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/126075.html

    (0)
    robot
    上一篇 2022-08-02
    下一篇 2022-08-02

    相关推荐

    • c++中的replace函数如何使用

      在C++中,replace函数可用于替换字符串中指定位置的字符或子串。其基本语法如下:str.replace(pos, len, new_str);其中,参数含义如下:pos:指定替换的起始位置len:指定替换的长度new_str:要替换的新字符串举个例子,假设有一个字符串str为”Hello, World!“,我们想要将其中的”World”替换为”Universe”,可以这样使用repl

      2024-05-13
      0
    • docker如何配置镜像仓库

      Docker 镜像仓库是用于存储和管理 Docker 镜像的地方,可以供用户下载和上传镜像。在 Docker 中配置镜像仓库一般需要以下步骤:选择镜像仓库:首先需要选择一个适合自己需求的镜像仓库,比如 Docker Hub、私有镜像仓库等。配置 Docker 客户端:在本地的 Docker 客户端中配置使用该镜像仓库,可以通过修改 Docker 配置文件或者使用命令行参数来指定使用的镜像仓库地址。

      2024-04-10
      0
    • Unix中怎么设置和使用环境变量

      在Unix中,可以使用export命令来设置和使用环境变量。以下是一些常用的设置和使用环境变量的方法:设置环境变量:export MY_VAR=”value”这将创建一个名为MY_VAR的环境变量,并将其设置为value。查看环境变量:echo $MY_VAR这将打印出名为MY_VAR的环境变量的值。永久设置环境变量:要使环境变量在每次登录时都可用,可以将其添加到~/.bashrc或~/.bas

      2024-04-30
      0
    • Go语言中反射的应用场景有哪些

      动态调用方法:通过反射机制可以动态调用具体的方法,这在一些框架中比较常见,比如web框架中根据请求的URL动态调用对应的处理方法。动态创建对象:可以利用反射机制动态创建对象,这在一些需要在运行时根据条件创建对象的场景中比较常见。获取结构体的字段和方法:通过反射可以获取结构体的字段和方法,这在一些需要对结构体进行操作的场景中比较有用,比如序列化和反序列化。动态修改字段的值:通过反射可以动态修改结构体

      2024-04-13
      0
    • WinForm中怎么添加一个数据网格视图控件

      要在WinForm中添加一个数据网格视图控件,可以按照以下步骤操作:打开Visual Studio并创建一个新的WinForm应用程序项目。在窗体上拖动一个DataGridView控件到窗体中,或者在代码中手动创建一个DataGridView控件:DataGridView dataGridView1 = new DataGridView();设置DataGridView控件的一些基本属性,例如位置

      2024-03-12
      0
    • python怎么创建字符串数组

      在Python中,字符串数组可以使用列表(list)来创建。下面是一个示例:# 创建一个包含字符串的数组str_array = [“apple”, “banana”, “cherry”]# 打印数组中的元素for item in str_array:print(item)这样就创建了一个包含三个字符串的数组,并打印了数组中的每个元素。您可以根据需要向数组中添加更多的字符串元素。

      2024-03-14
      0