今天学习MVVM架构中“事件”的添加并调用,特记录如下,学习资料均来自于网络,特别感谢翁智华 的 利刃 MVVMLight 6:命令基础

  1. 在MVVM Light框架中,事件是WPF应用程序中UI与后台代码进行交互的最主要方式,与传统方式不同,mvvm中主要通过绑定到命令来进行事件的处理
  2. 相对于CodeBehind 的方式,使用命令会好很多:最大的特点就是解耦View和ViewModel的行为交互,将视图的显示和业务逻辑分开。
  3. 对View上的某个元素进行命令的绑定,触发点击操作的时候,这个按钮实际完成的是对应ViewModel中的所绑定的方法的执行。

扩展:

常用Wpf开发中我们在ViewModel中实现INotifyPropertyChanged接口,通过触发PropertyChanged事件达到通知UI更改的目的;
在MVVMLight框架里,这里我们定义的ViewModel都继承自ViewModelBase,ViewModelBase封装在MvvmLight框架中,它已经实现了INotifyPropertyChanged接口,
因此我们在定义ViewModel属性时,只需要调用RaisePropertyChanged(PropertyName)就可以进行属性更改通知了。

WPF命令是通过实现 ICommand 接口创建的

ICommand 公开了两个方法(Execute 及 CanExecute)和一个事件(CanExecuteChanged)

Execute方法 执行与命令关联的操作
CanExecute方法  确定是否可以在当前命令目标上执行命令,返回值为true则按钮可用,为false的时候按钮disable。

在MvvmLight中,实现ICommand接口的类是RelayCommand。

 

我们在 WelcomeViewModel 类中添加以下内容:

public class WelcomeViewModel : ViewModelBase
{
...... #region 命令
private RelayCommand changeTxtCommand;
/// <summary>
/// 改变文本框内容
/// </summary>
public RelayCommand ChangeTxtCommand
{
get
{
if (changeTxtCommand == null)
return new RelayCommand(() => ExcuteChangeTxt());
return changeTxtCommand;
}
set { changeTxtCommand = value; }
} /// <summary>
/// 改变文本框内容
/// </summary>
private void ExcuteChangeTxt()
{
Welcome.Introduction = "新修改后的内容";
}
#endregion
}

注:RelayCommand(() => ExcuteChangeTxt());  表示没有参数 ,且 返回类型为void,这个在下一篇博文中详细说明。

在 WelcomeView.xaml 中添加按钮:

  <StackPanel  VerticalAlignment="Center" HorizontalAlignment="Center" >
<TextBlock Text="{Binding Welcome.Introduction}" FontSize="" ></TextBlock>
<Button Command="{Binding ChangeTxtCommand}">更改文本</Button>
</StackPanel>

测试窗口如下:

点击按钮后  =》

符号我们预期,这样,我们简单的实现了按钮“事件”。


总结:

在MVVM Light框架中,事件是通过命令实现,所有的命令都从 RelayCommand 派生出来。

简单的步骤如下:

private RelayCommand changeTxtCommand;

public RelayCommand ChangeTxtCommand
{
  get
  {
    if (changeTxtCommand == null)
    return new RelayCommand(() => ExcuteChangeTxt());
    return changeTxtCommand;
  }
  set { changeTxtCommand = value; }
} private void ExcuteChangeTxt()
{
  Welcome.Introduction = "新修改后的内容";
}

最后在View中绑定命令即可。例如:<Button Command="{Binding ChangeTxtCommand}">更改文本</Button>


这一小节到此结束,新手入门,不免有偏差,请留言不吝赐教。

MVVM Light 新手入门(3) :ViewModel / Model 中定义“事件” ,并在View中调用 (无参数调用)的更多相关文章

  1. MVVM Light 新手入门(2) :ViewModel / Model 中定义“属性” ,并在View中调用

    今天学习MVVM架构中“属性”的添加并调用,特记录如下,学习资料均来自于网络,特别感谢翁智华的利刃 MVVMLight系列. 一个窗口的基本模型如下: View(视图) -> ViewModel ...

  2. MVVM Light 新手入门(1):准备阶段

    1.新建WPF空白项目. 2.NuGet 程序包中安装 3.根据MVVM分层结构,建立包含Model.View.ViewModel三层文件夹 如图: 1.View负责前端展示,与ViewModel进行 ...

  3. Mvvm Light Toolkit 入门

    原文:Mvvm Light Toolkit 入门 前言 之前学习UWP的时候就一直看到有关MVVM的资料但是一直没有系统的去学,最近正好有时间,特地来攻破这个点,顺便学习一下VS与GitHub的链接和 ...

  4. js高级程序设计书中,有一句话在全局作用域中定义的函数实际上只 能被某个对象调用???

    js没有块级作用域(题外话:函数可以作为一个块级),所以我们经常使用闭包来模拟块级作用域,以避免变量或者函数因为名称相同而产生的冲突. 重点来了: 所以,如果我们把哪个变量或者函数放在全局作用域中,那 ...

  5. Backbone.js 的 View 中定义事件

    使用 Backbone 的 View 时,可以象传统 jQuery 那样定义事件,$("selector").click(function(){...}).幸运的是 Backbon ...

  6. 在C++Builder中定义事件的实现方法

    ++Builder是由Borland公司推出的一款可视化集成开发工具.C++Builder的集成开发环境(IDE)提供了一系列可视化快速应用程序开发(RAD)工具,让程序员可以很轻松地建立和管理自己的 ...

  7. 将Controller中的数据传递到View中显示

    如何将Controller 中的数据传送到View 步骤: (1)要有数据,如果要用到对象可以在Model 中定义对应的类 (2)要有装数据的容器: System.Text.StringBuilder ...

  8. C#中在定义事件委托时怎样跨窗体传递参数

    场景 C#中委托与事件的使用-以Winform中跨窗体传值为例: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100150700 ...

  9. 如何把car中的模块导入adams/view中

    在你的adams安装目录下的acar文件夹下找到acar.cfg文件,将里面的 MDI_ACAR_PLUS_AVIEW 后面的no改成yes,在car中的tool下面就可以找到进入view环境的命令了 ...

随机推荐

  1. 查看CPU序列号以及系统信息

    CPU序列号  wmic cpu get processorid  现在也不唯一,比如联想同款机器,因为CPU批量生产,id也是一样 操作系统信息   systeminfo 查看硬件信息   dxdi ...

  2. swift UIAlertController使用 UIAlertController的宽度 为270

    添加子控件 1. 有标题, alert标题高度大概 是 40, 子控件的 Y一般在40 ,如果中间有换行, \n 的高度大概是30 2.alert的宽度 是270, 设置frame 的时候注意 /// ...

  3. ROS两种workspace :overlay rosbuild_ws->catkin_ws->ROS库,

    概念 ROS里面有一系列概念,作为初学者,最先接触的概念无非是node, package和workspace. node node是ROS里面最小的执行单位,你可以把node看成是一个main函数,当 ...

  4. PHP下ajax跨域的解决方案之CORS

    由于安全的限制(同源策略,javascript只能访问同域名下的内容),如果需要进行跨域操作,那就免不了要进行跨域.   CORS(跨域资源共享,Cross-Origin Resource Shari ...

  5. .NET获得上传图片宽高

    代码: //图片大小限制--------------------------- System.Drawing.Image txtStoryimage = System.Drawing.Image.Fr ...

  6. 将Win7笔记本设置成WiFi热点(无线路由器)

    查看是否能启动WiFi网卡: S1:运行cmd命令,打开命令提示符窗口(以管理员身份运行). S2:在命令行输入:netsh wlan show drivers. 若“支持的承载网络”后为“是”,则可 ...

  7. 小X归来 模拟赛1 解析

    Problem1 单峰 小X 归来后,首先对数列很感兴趣.他想起有1类特殊的数列叫单峰数列. 我们说一个数列 {ai} 是单峰的,当且仅当存在一个位置 k 使得 ai < ai+1(i < ...

  8. Codeforces 681C. Heap Operations 优先队列

    C. Heap Operations time limit per test:1 second memory limit per test:256 megabytes input:standard i ...

  9. 设计神器 - 摹客设计系统上线了 | 晒出你的设计规范,赢iPad Pro!

    在国内,设计规范也许还是个不太常用的概念,但是如果你正好有参与互联网公司的产品设计,你应该早就已经体会到设计规范的重要性了.UI设计师总是要花费大量的时间和精力向开发描述一大堆设计细节,但是产品最后呈 ...

  10. centos / debian 安装iptables服务

    debian: #使用可参考 https://www.debian.cn/archives/991 #配置文件位于 /etc/iptables #重新配置使用dpkg-reconfigure ipta ...