C#中WVVM的使用

学习WVVM模式,设计一个简单的菜单显示和选择时显示个数的一个例子。

最终效果:

所建文件结构如下:

MenuModel:菜品属性-名称和价格

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WpfApplication2.Model
{
   public class MenuModel
    {
        public string Name { get; set; }
        public string Price { get; set; }

    }
}

DelegateCommend:命令属性

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Input;

namespace WpfApplication2.Model
{
   public class DelegateCommend:ICommand
    {
        public Action<object> ExecuteAction { get; set; }
        public Func<object,bool> CanExecuteFunc { get; set; }
        public bool CanExecute(object parameter)
        {
            if (CanExecuteFunc==null)
            return true;
            return CanExecuteFunc(parameter);
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            if (ExecuteAction == null)
                return;
            ExecuteAction(parameter);
        }
    }
}

DishService:初始化菜品集合

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WpfApplication2.Model;

namespace WpfApplication2.Servers
{
   public class DishService
    {
       public List<ListMenuModel> GetDishes()
       {
           List<ListMenuModel> list = new List<ListMenuModel>();
           list.Add(new ListMenuModel {Dishes= new MenuModel{Name = "黄瓜", Price = "8" },IsSelected=false});
           list.Add(new ListMenuModel { Dishes = new MenuModel { Name = "酸菜", Price = "5" }, IsSelected = false });
           list.Add(new ListMenuModel { Dishes = new MenuModel { Name = "拉皮", Price = "7" }, IsSelected = false });
           list.Add(new ListMenuModel { Dishes = new MenuModel { Name = "凉粉", Price = "6" }, IsSelected = false });
           list.Add(new ListMenuModel { Dishes = new MenuModel { Name = "豆芽", Price = "3" }, IsSelected = false });
           list.Add(new ListMenuModel { Dishes = new MenuModel { Name = "京皮", Price = "5" }, IsSelected = false });
           return list;
       }
    }
}

ListMenuModel:界面中菜品和选择复选框的viewmodel,具有通知功能

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace WpfApplication2.Model
{
    public class ListMenuModel:INotifyPropertyChanged
    {
        public MenuModel Dishes { get; set; }
        private bool isSelected;

        public bool IsSelected
        {
            get { return isSelected; }
            set { isSelected = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsSelected"));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}

MainViews:界面所有数据绑定的源

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using WpfApplication2.Model;
using WpfApplication2.Servers;

namespace WpfApplication2.Views
{
   public class MainViews:INotifyPropertyChanged
    {
        public DelegateCommend SelectCmd { get; set; }

        private List<ListMenuModel> dishes;

        public List<ListMenuModel> Dishes
        {
            get { return dishes; }
            set { dishes = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Dishes"));
            }
        }

        private int count;

        public int Count
        {
            get { return count; }
            set { count = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("Count"));
            }
        }

       public MainViews()
       {
           Dishes = (new DishService()).GetDishes();

           SelectCmd = new DelegateCommend();

           SelectCmd.ExecuteAction = x =>
           {
               this.Count = Dishes.Where(n => n.IsSelected == true).Count();
           };
       }

       public event PropertyChangedEventHandler PropertyChanged;
    }

}

MainWindow.xaml:界面

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>

        <Border CornerRadius="6" Background="Yellow" BorderThickness="3" BorderBrush="Orange" Margin="0,0,0.4,-0.2" Grid.RowSpan="3">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="auto"/>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="auto"/>
                </Grid.RowDefinitions>
                <Border BorderThickness="1" BorderBrush="Orange" Padding="4" CornerRadius="6">
                    <StackPanel>
                        <StackPanel.Effect>
                            <DropShadowEffect Color="LightBlue"></DropShadowEffect>
                        </StackPanel.Effect>
                        <TextBlock Text="欢迎光临!" FontSize="30"></TextBlock>
                    </StackPanel>
                </Border>

                <DataGrid Name="dishGrid" Grid.Row="1" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" GridLinesVisibility="None">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="菜名" Binding="{Binding Dishes.Name}"></DataGridTextColumn>
                        <DataGridTextColumn Header="价格" Binding="{Binding Dishes.Price}"></DataGridTextColumn>
                        <DataGridTemplateColumn >
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <CheckBox IsChecked="{Binding IsSelected,UpdateSourceTrigger=PropertyChanged}" Command="{Binding DataContext.SelectCmd,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Window}}}"></CheckBox>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                    </DataGrid.Columns>

                </DataGrid>

                <StackPanel Grid.Row="2" HorizontalAlignment="Right" Orientation="Horizontal" Margin="5">
                    <TextBlock Text="共计" FontSize="16 "></TextBlock>
                    <TextBox IsReadOnly="True" Width="50" Text="{Binding Count}"></TextBox>
                    <Button Content="下单" Height="24"  Width="120"></Button>
                </StackPanel>
            </Grid>
        </Border>
    </Grid>
</Window>

其C#代码如下:设置数据及绑定

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WpfApplication2.Model;
using WpfApplication2.Servers;
using WpfApplication2.Views;
namespace WpfApplication2
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            MainViews mw = new MainViews();

            this.DataContext = mw;
            dishGrid.ItemsSource = mw.Dishes;

        }
    }
}
时间: 2024-12-30 03:21:23

C#中WVVM的使用的相关文章

[UWP]xaml中自定义附加属性使用方法的注意项

---恢复内容开始--- 随笔小记,欢迎指正 在UWP平台上做WVVM的时候,想针对ListBox的SelectionChanged事件定义一个自定义的命令,于是使用自定义附加属性的方式.可是最后自定义附加属性SelectionChangedCommand写好了,却不知道怎么在XAML中使用. 我的自定义属性如下: namespace SelectionChangedCommand.Services { public static class SelectionChangedBehavior {

win10周年版eNSP中启动AR提示错误代码40问题

win 10操作系统中安装eNSP 1.2.00.380,一直运行正常,但在2016年11月升级win 周年版之后,启动AR时启动失败,提示错误代码40. 卸载eNSP及VirtualBox之后重装问题依旧.按照论坛和网上各种说法更新virtualbox修改虚拟网卡设置,或者重新注册都无法解决,最终多方查找终于找到解决方案. 环境:win10 周年版,eNSP 1.2.00.380,VirtualBox 4.2.8 eNSP注册后virtualbox管理器中会出现AR_Base,WLAN_AC_

css中的px、em、rem 详解

概念介绍: 1.px (pixel,像素):是一个虚拟长度单位,是计算机系统的数字化图像长度单位,如果px要换算成物理长度,需要指定精度DPI(Dots Per Inch,每英寸像素数),在扫描打印时一般都有DPI可选.Windows系统默认是96dpi,Apple系统默认是72dpi. 2.em(相对长度单位,相对于当前对象内文本的字体尺寸):是一个相对长度单位,最初是指字母M的宽度,故名em.现指的是字符宽度的倍数,用法类似百分比,如:0.8em, 1.2em,2em等.通常1em=16px

angularJs中关于ng-class的三种使用方式说明

在开发中我们通常会遇到一种需求:一个元素在不同的状态需要展现不同的样子. 而在这所谓的样子当然就是改变其css的属性,而实现能动态的改变其属性值,必然只能是更换其class属性 这里有三种方法: 第一种:通过数据的双向绑定(不推荐) 第二种:通过对象数组 第三种:通过key/value 下面简单说下这三种: 第一种:通过数据的双向绑定 实现方式: function changeClass(){   $scope.className = "change2"; } <div clas

Uploadify/uploadifive上传(中文文档)

Uploadify是一款基于JQuery的优秀的文件/图片上传的插件,有基于Flash和HTML5两种版本. Uploadify/uploadifive主要特点有: 1. 多文件上传 2. 个性化设置 3. 上传进度条显示 4. 拖拽上传(HTML5版本) 官网:http://www.uploadify.com 部署 在部署一个Uploadify实例前,请确保满足最低要求: 1.jQuery 1.4.x 或更高版本 2.Flash Player 9.0.24 或更高版本 3.支持PHP, ASP

XShell 连接虚拟机中的服务器 失败 、连接中断(Connection closed by foreign host.)

在使用XShell连接虚拟机中的服务器时,报以下错误并断开连接,之前连接还是挺稳定的,忽然就这样了 Last login: Thu Aug 10 21:28:38 2017 from 192.168.1.102 [[email protected] ~]# Socket error Event: 32 Error: 10053. Connection closing...Socket close. Connection closed by foreign host. Disconnected f

微信浏览器中调用支付宝支付

众所周知,在微信浏览器中是无法唤起支付宝的,会提示请在浏览器中打开,如果非要在微信浏览器中调起支付宝的话,只能是跳出微信浏览器,关于这一点,在支付宝官网给出了一个例子.但是,话说回去,后来我仔细想想,其实真的没有必要非要在微信浏览器中调起支付宝支付(当时真是一根筋啊啊啊...) 支付宝手机网站支付的官方文档: https://doc.open.alipay.com/docs/doc.htm?treeId=203&articleId=105288&docType=1 快速接入: https:

C#中Dictionary的介绍

关键字:C# Dictionary 字典 作者:txw1958原文:http://www.cnblogs.com/txw1958/archive/2012/11/07/csharp-dictionary.html 说明    必须包含名空间System.Collection.Generic     Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)     键必须是唯一的,而值不需要唯一的     键和值都可以是任何类型(比如:string, int, 自定义类型,等等

C#中使用ffmpeg合并视频

首先将最新的ffmpeg.exe放到debug路径下,下载地址 http://www.ffmpeg.org/download.html 然后调用此方法 public void CombineMp4WithoutTxt(string StrMP4A, string StrMP4B, string StrOutMp4Path) { Process p = new Process();//建立外部调用线程 p.StartInfo.FileName = System.Windows.Forms.Appl