MVVM模式是把表现层和业务层完全分离,所以这里就使用MVVM制作一个极其简单的WPF的例子:

先看看最终图:

aaarticlea/png;base64,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" alt="" />

上图,需要实现的是,界面两个按钮,一个是生成随机两个数,一个是对两个数比较,把大的数显示出来。所以需要三个属性,两个事件。

由于逻辑比较简单,不用写model等类,实现如下:

1、创建基类NotifictionObject.cs,实现接口INotifyPropertyChanged

 class NotifictionObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; public void RaisePropertyChanged(string str)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(str));
} }

2、创建DelegateCommand.cs,继承ICommand

  class DelegateCommand : ICommand
{
public Func<object,bool> CanExecuteFunc { get; set; } public Action<object> ExecuteAction { get; set; } public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter)
{
if (CanExecuteFunc == null)
return true;
return CanExecuteFunc(parameter);
} public void Execute(object parameter)
{
if (ExecuteAction == null)
return;
ExecuteAction(parameter);
}
}

3、再创建类MainWindowViewModel.cs,继承NotifictionObject基类

class MainWindowViewModel : NotifictionObject
{
private int a; public int RndA
{
get { return a; }
set
{
a = value;
RaisePropertyChanged("RndA");
}
}
private int b; public int RndB
{
get { return b; }
set
{
b = value;
RaisePropertyChanged("RndB");
}
}
private int result; public int Result
{
get { return result; }
set
{
result = value;
RaisePropertyChanged("Result");
}
} public DelegateCommand CompareCommand { get; set; }
public DelegateCommand ReNewRndNumCommand { get; set; } Random rnd = new Random();
public MainWindowViewModel()
{
LoadData(); CompareCommand = new DelegateCommand();
CompareCommand.ExecuteAction = (para) =>
{
Result = RndA >= RndB ? RndA : RndB;
}; ReNewRndNumCommand = new DelegateCommand();
ReNewRndNumCommand.ExecuteAction = (para) =>
{
LoadData();
};
} public void LoadData()
{
RndA = rnd.Next(, );
RndB = rnd.Next(, );
}
}

4、类都实现了,现在实现界面部分

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Margin="" x:Name="textBlock" TextWrapping="Wrap" Text="数字1:"/>
<TextBlock Margin="" x:Name="textBlock1" Grid.Column="" TextWrapping="Wrap" Text="{Binding RndA}"/>
<TextBlock Margin="" x:Name="textBlock2" Grid.Column="" TextWrapping="Wrap" Text="数字2:"/>
<TextBlock Margin="" x:Name="textBlock3" Grid.Column="" TextWrapping="Wrap" Text="{Binding RndB}"/> <Button Grid.Row="" Command="{Binding ReNewRndNumCommand}" Grid.ColumnSpan="" Width="" Margin="">重新生成数</Button>
<Button x:Name="button" Command="{Binding CompareCommand}" Margin="" Content="比较大小" Grid.ColumnSpan="" Grid.Row="" Grid.Column="" Width=""/> <TextBlock x:Name="textBlock4" Margin="" HorizontalAlignment="Center" Grid.Column="" Grid.Row="" Grid.ColumnSpan="" TextWrapping="Wrap" Text="{Binding Result}"/> </Grid>

5.在主界面的C#初始化时添加上下文:

public MainWindow()
{
InitializeComponent(); this.DataContext = new MainWindowViewModel();
}

代码就不详细介绍了,自己慢慢看,不是太难,多多练习。

WPF比较两个随机数大小写,利用MVVM思想实现的更多相关文章

  1. 【WPF】两则动画效果

    原文:[WPF]两则动画效果 引言 利用WPF的动画可以轻而易举的实现各种各样的特效,如擦除,滑动进入等,先看两个效果图 第一个效果 这个动画其实利用了OpacityMask和LinearGradie ...

  2. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  3. 利用MVVM设计快速开发个人中心、设置等模块

    我们在做iOS开发过程中,静态页面的开发比开发动态页面更让我们开发者抓狂.因为动态页面通常是一个页面一种cell样式,作为开发者只需要专注于定制好一种样式之后,就可以使用数据填充出较好的界面.而静态c ...

  4. WPF: 自动设置Owner的ShowDialog 适用于MVVM

    原文:WPF: 自动设置Owner的ShowDialog 适用于MVVM 原文地址:http://www.mgenware.com/blog/?p=339 WPF中的Windows的ShowDialo ...

  5. VS编程,WPF中两个滚动条 ScrollViewer 同步滚动的一种方法

    原文:VS编程,WPF中两个滚动条 ScrollViewer 同步滚动的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/ar ...

  6. WPF系列教程——(二)使用Prism实现MVVM设计模式 - 简书

    原文:WPF系列教程--(二)使用Prism实现MVVM设计模式 - 简书 本文假设你已经知道MVVM设计模式是什么,所以直接进入正题,今天我们就用Prism来实现WPF的MVVM设计模式,百度上关于 ...

  7. 对比使用Charles和Fiddler两个工具及利用Charles抓取https数据(App)

    对比使用Charles和Fiddler两个工具及利用Charles抓取https数据(App) 实验目的:对比使用Charles和Fiddler两个工具 实验对象:车易通App,易销通App 实验结果 ...

  8. WPF的两棵树与绑定

    原文:WPF的两棵树与绑定   先建立测试基类 public class VisualPanel : FrameworkElement { protected VisualCollection Chi ...

  9. WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化

    原文:WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化 注:最近在做3D机械模型重建方面的软件,需要根据光栅传感器采集的数据绘制3D图形,并显示出色差以及 ...

随机推荐

  1. libevent学习三(Getting an event_base)

    1.一个event_base持有了一系列的事件,并监控和决定哪些事件需要激活, 2.每一个event_base背后都有一个支持其工作的方法(诸如select,poll,epoll,kquene...) ...

  2. JavaWeb(三)——Tomcat服务器(二)

    一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

  3. PS 证件照换颜色

    1.打开要修改的图片,然后先Ctrl+J备份一份 2.点击魔法棒,点击要换颜色的地方,如衣服,之后会出现虚线,如果自动选择的不全,可以按住Shift键自行选择区域 3.然后Shift+Fn+F5(由于 ...

  4. 05-JVM对象探秘

    一.对象的内存布局         以Hotspot虚拟机为例,对象在内存中的结构可以分为三部分:对象头(header).实例数据(instance data).对齐填充(padding). 1.1. ...

  5. HTTP请求中get和post的区别是什么

    GET和POST是Http请求中最常用的两种请求方法 首先介绍GET与POST的差异: (1)GET请求资源数据,POST向服务器传递需要处理的数据 (2)GET传递数据大小不超过2kb,POST没有 ...

  6. katalon系列三:Project Setting-项目设置

    安装完katalon后,用QQ邮箱注册并登陆,然后新建一个项目.点击菜单Project-Project Setting打开项目设置,接下来介绍几个你可能会用到的设置. 1.Text Design-We ...

  7. 移动性能测试之gemebench安装

    越来越多的人从事各种移动端性能测试,但工具和文档的资料却相对较少,这两天需要测试一款APP的性能,就来先简单介绍下gamebench的安装吧! 作为国人来说,使用gamebench还是有相当多的坑点: ...

  8. 爬虫2.2-scrapy框架-文件写入

    目录 scrapy框架-文件写入 1. lowb写法 2. 高端一点的写法 3. 优化版本 scrapy框架-文件写入 1. lowb写法 ~pipelines.py 前提回顾,spider.py中 ...

  9. linux NULL 的定义

    #undef NULL #if defined(__cplusplus) #define NULL 0 #else #define NULL ((void *)0) #endif

  10. java核心技术 笔记

    一 . 总览 1. 类加载机制:jdk内嵌的class_loader有哪些,类加载过程.--后面需要补充 2. 垃圾收集基本原理,常见的垃圾收集器,各自适用的场景.--后面需要补充 3. 运行时动态编 ...