MVVM学习笔记

MVVM学习笔记

1、MVVM的简介

MVVM模式是Model-View-ViewModel模式的简称,也就是由模型(Model)、视图(View)、视图模型(ViewModel),其目的是为了实现将业务和界面分开,降低耦合度。

2、示例(绑定TextBox和Combox控件)

总体结构:

View层代码:

        <Label Content="购买数:"
               Style="{StaticResource LabStyle}"
               Grid.Row="3"
               Grid.Column="0" />
        <TextBox Grid.Row="3"
                 Grid.Column="1"
                 Style="{StaticResource TextBoxStyle}"
                 Text="{Binding BuyTextBox,UpdateSourceTrigger=PropertyChanged}">
        </TextBox>

 <ComboBox Grid.Row="0"
                  Grid.Column="1"
                  Style="{StaticResource ComboxStyle}">
            <ComboBoxItem Content="西瓜" />
        </ComboBox>
        <ComboBox Grid.Row="1"
                  Grid.Column="1"
                  Style="{StaticResource ComboxStyle}"
                  ItemsSource="{Binding Prices}"
                  SelectedItem="{Binding SelectPrice, UpdateSourceTrigger=PropertyChanged}">
        </ComboBox>

ViewModel层代码

   /// <summary>
        /// 设置购买量属性
        /// </summary>
        public int BuyTextBox
        {
            get { return m_buyNum; }
            set
            {
                m_buyNum = value;
                //计算金额
                m_money = m_selectPrice*m_buyNum;
                if (m_buyNum > m_surplus)
                {
                    MessageBox.Show("购买数量大于剩余数量,请重新输入购买数量!");
                    m_buyNum = 0;
                    m_money = 0;
                }
                OnPropertyChange<CalculateFruitVm>(vm => vm.BuyTextBox);
            }
        }

    /// <summary>
        /// 设置价格属性
        /// </summary>
        public ObservableCollection<int> Prices
        {
            get { return m_prices; }
            set
            {
                m_prices = value;
                OnPropertyChange<CalculateFruitVm>(vm => vm.Prices);
            }
        }

 /// <summary>
        /// 设置选择价格属性
        /// </summary>
        public int SelectPrice
        {
            get { return m_selectPrice; }
            set
            {
                m_selectPrice = value;
                m_money = m_selectPrice*m_buyNum;
                OnPropertyChange<CalculateFruitVm>(vm => vm.SelectPrice);
            }
        }

  /// <summary>
        /// 构造函数CalculateFruitVm
        /// </summary>
        public CalculateFruitVm()
        {
            m_prices.Add(4);
            m_selectPrice = 4;
            m_prices.Add(5);
        }

注意:这里是在构造函数CalculateFruitVm中设置价格并选择价格,因价格是combox控件,除了需要设置价格属性外,还需要设置价格选择属性。

Button按钮

View层代码

            <Button Content="返回"
                    Grid.Column="2"
                    Style="{StaticResource ButtonStyle}"
                    HorizontalAlignment="Left"
                    Command="{Binding CancleCommand}"></Button>

ViewModel层代码

        /// <summary>
        /// CancleCommand命令
        /// </summary>
        public ICommand CancleCommand
        {
            get { return m_cancelCommand; }
        }

        /// <summary>
        /// 构造函数CalculateFruitVm
        /// </summary>
        public CalculateFruitVm()
        {
            m_cancelCommand = ICommandFactory.CreateCommand(CancelCmdExecute, CanCancelCmdExecute);
        }

        /// <summary>
        /// 声明CancelEvent事件
        /// </summary>
        public event EventHandler<EventArgs> CancelEvent;
        /// <summary>
        /// CanCancelCmdExecute事件
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private bool CanCancelCmdExecute(object arg)
        {
            return true;
        }

        /// <summary>
        /// CancelCmdExecute事件
        /// </summary>
        /// <param name="obj"></param>
        private void CancelCmdExecute(object obj)
        {
            if (CancelEvent != null)
            {
                CancelEvent(this, EventArgs.Empty);
            }
        }

.xaml.cs代码

  public CalculateFruit()
        {
            InitializeComponent();
            CalculateFruitVm calculateFruitVm = new CalculateFruitVm();
            DataContext = calculateFruitVm;
            calculateFruitVm.CancelEvent += calculateFruitVm_CancelEvent;
        }

        /// <summary>
        /// 点击返回按钮,返回主界面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void calculateFruitVm_CancelEvent(object sender, EventArgs e)
        {
            MainWindow mainWindow = new MainWindow();
            mainWindow.Show();
            this.Hide();
        }

Button按钮需要在View层用command绑定事件,ViewModel中创建命令、构造函数、声明事件,最后在.xaml.cs中加载ViewModel,并实现界面跳转、关闭等操作。

3、总结

MVVM 中更好的实现了面向对象中的继承和封装,所有的命令都继承自ICommand接口,将所有的命令用ViewModel层去实现。

当界面之间需要互相传值时,需要在VM中传递界面需要的值,实例化需要传到哪个界面的VM,示例如下:

隐藏事件

   private void HideCmdExecute(object obj)
        {
            if (m_buyNum > 0 && m_selectPrice > 0)
            {
                if (HideEvent != null)
                {
                    //计算剩余量
                    m_surplus -= m_buyNum;
                    //计算售卖总量
                    CalculateNum += m_buyNum;
                    //计算售卖总金额
                    CalculateMoney += m_money;
                    //new出ResultCalculateVm并赋值
                    ResultCalculateVm resultCalculateVm = new ResultCalculateVm();
                    resultCalculateVm.SalesNumberTextBox = CalculateNum;
                    resultCalculateVm.TotalMoney = CalculateMoney;
                    resultCalculateVm.TotalSurplus = m_surplus;
                    HideEvent(this, new FruitEventArgs {ResultCalculateVm = resultCalculateVm});
                }
            }
        }

时间: 2024-08-26 04:05:15

MVVM学习笔记的相关文章

ListBox mvvm 学习笔记

1. ListBox  MvvM 例子1. 简单的绑定,ItemsSource 绑定到一个实现了IEnumerable 的类上.一般该绑定都是双向的,所以优先考虑使用 ObservableCollection<T> 的类.这样界面和后台数据就同步了.针对于ListBox 的控件,我们比较关心的是SelectedItem,在mvvm 中,为了解耦前端界面和后台的逻辑,我们采用 如下的方式,SelectedItem 双向绑定到ViewModel上的一个公用属性上.同时,该公用属性要实现INotif

Unity uFrame 1.6 MVVM 学习笔记(一)

未写完...... Sub System 生成一个类: 1.UISysLoader 可重写方法: Load 属性,方法: this.EventAggregator  事件聚合器(虽然有些类也有该方法,看源码好像有些不一样,待检验异同) this.Container 怀疑是集合类型的容器,即集合的父节点,待检验 this.CreateViewModel  怀疑是创建一个ViewModel. this.GetView   得到参数下的ViewBase类 this.GetViewModel 内部通过G

WPF-MVVM模式学习笔记3——MVVM概念再次挖掘

通过上篇文章<WPF-MVVM模式学习笔记2--MVVM简单样例>中举了一个例子,我对MVVM大概有了一个比较浅显的意思.同时,看过前两篇文章的人,也知道我的这个系列的文章大多数来源于其他的博客,我其实只是起了一个汇总的作用,毕竟我也是在学习,肯定是要去网络上学习别人的笔记喽.本篇文章将以温故而知新的方式再次去理解MVVM,力求对MVVM的认识再深一个层次. 1.再看"M-V-VM" M:即Model,由现实世界抽象出来的模型. V:即View,视图,界面,该界面与用户输入

[ExtJS学习笔记]第九节 Extjs5的mvc与mvvm框架结构简介

本文地址:http://blog.csdn.net/sushengmiyan/article/details/38537431 本文作者:sushengmiyan -------------------------------------------------------------资源链接----------------------------------------------------------------------- 翻译来源:http://docs.sencha.com/ext

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

Caliburn.Micro学习笔记(四)----IHandle&lt;T&gt;实现多语言功能

Caliburn.Micro学习笔记(四)----IHandle<T>实现多语言功能 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果 点击英文  变成英文状态点chinese就会变成中文                          源码的下载地址在文章的最下边 多语言用的是资源文件建

Vue学习笔记目录

本文为转载,原文:Vue学习笔记目录 Vue介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使用Vue.js. 如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM.它通过一些特殊的HTML语法,将DOM和数据绑定起来.一旦你创建了绑定,DOM将和数据

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开