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. 修改注册表删除Windows资源管理器 “通过QQ发送” 右键菜单项

    运行regedit 展开至:HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers 删除QQShellExt项

  2. MySQL高级第五章——主从复制

    一.复制的基本原理 slave会从master读取binlog(二进制日志文件)进行数据同步 步骤: 详细操作步骤请参见:http://www.cnblogs.com/luckcs/articles/ ...

  3. Java:break和continue关键字的作用

    二者的作用和区别 1. break:直接跳出当前循环体(while.for.do while)或程序块(switch).其中switch case执行时,一定会先进行匹配,匹配成功返回当前case的值 ...

  4. Python之多进程多线程

    一.多进程与多线程的概念 1.多进程的概念 进程是程序在计算机上的的一次执行活动.当你运行一个程序,你就启动了一个进程.显然,程序是死的(静态的),进程是活的(动态的).进程可以分为系统进程和用户进程 ...

  5. 在ubuntu trusty下安装python的rasterio库

    就这些吧.. apt-get update -y apt-get install -y software-properties-common add-apt-repository ppa:ubuntu ...

  6. JAVA日志框架概述

            日志用来记录应用的运行状态以及一些关键业务信息,其重要性不言而喻,通常我们借助于现有的日志框架完成日志输出.目前开源的日志框架很多,常见的有log4j.logback等,有时候我们还会 ...

  7. Katalon 学习笔记(一)

      工具介绍: Katalon Studio是一个能提供一整套功能来实现Web,API和Mobile的全自动测试解决方案的自动化测试平台.Katalon Studio构建于开源Selenium和App ...

  8. 如何编写 Python 程序

    如何编写 Python 程序 从今以后,保存和运行 Python 程序的标准步骤如下: 对于 PyCharm 用户 打开 PyCharm. 以给定的文件名创建新文件. 输入案例中给出的代码. 右键并运 ...

  9. leetcode合并区间

    合并区间     给出一个区间的集合,请合并所有重叠的区间. 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: ...

  10. 数据库Mysql的学习(六)-子查询和多表操作

    )*0.05 WHERE card_id ='20121xxxxxx'; //子查询就是一个嵌套先计算子查询 SELECT * FROM borrow WHERE book_id =(SELECT b ...