前段时间一直在学习MVC,工作需要,现在需要180度急转弯,搞WPF,MVVM,只能找资料学习了。

WPF中有一个消息机制,就是当前台控件绑定的值改变时,会自动通知到指定的事件来改变VM的值,反之亦然。

这个机制实际上是一个接口:INotifyPropertyChanged

凡是要实现这种自动跟随变化的都要实现这个接口,这个接口只有一个成员,是一个事件:

public event PropertyChangedEventHandler PropertyChanged;

配合它,要自己写一个方法:

private void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler!=null)
{
handler(this,new PropertyChangedEventArgs(propertyName));
}
}

CallerMemberName这个标记很好玩,可以自动赋值给后边的参数,赋的值就是调用此方法的属性,并且在调用的时候不用指定是哪个属性,很方便。

是在http://www.cnblogs.com/mgen/archive/2012/06/18/2553039.html这篇文章中学到的。

上全码:

public class SongViewModel : INotifyPropertyChanged
{
public SongViewModel()
{
Song = new Song
{
ArtistName = "NoName",
SongTitle = "NoName"
};
} private int _count = ;
private Song Song { set; get; }
public string ArtistName
{
get { return Song.ArtistName; }
set
{
if (Song.ArtistName!=value)
{
Song.ArtistName = value;
RaisePropertyChanged();
} }
} public event PropertyChangedEventHandler PropertyChanged; private void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler!=null)
{
handler(this,new PropertyChangedEventArgs(propertyName));
}
} }

还有一个重要接口是:ICommand

使用它,就可以不必再像以往一样绑定按钮的click事件来实现改变值了。

现在用绑定控件的command事件来达到同样的效果,WPF页面的CS页无须写任何代码,一切操作都在ViewModel中。

以上代码再添加点:

private bool CanExecute()
{
return true;
} private void Execute()
{
ArtistName = string.Format("snake{0}", ++_count);
}
public ICommand UpArtistName
{
get { return new RelayCommand(Execute, CanExecute); }
}

RelayCommand是自己定义的继承自ICommand的类,那两个方法是所需要的参数

操作就放在Execute中就可以了

CanExecute中放是否允许此命令执行的逻辑

具体RelayCommand代码如下:

public class RelayCommand:ICommand
{
private Func<bool> _canExecute ;
private Action _execute; public RelayCommand(Action execute):this(execute,null)
{} public RelayCommand(Action execute, Func<bool> canExecute)
{
if (execute==null)
{
throw new ArgumentNullException("execute");
}
_canExecute = canExecute;
_execute = execute;
} public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute();
} public event System.EventHandler CanExecuteChanged
{
add
{
if (_canExecute!=null)
{
CommandManager.RequerySuggested += value;
}
}
remove
{
if (_canExecute!=null)
{
CommandManager.RequerySuggested -= value;
}
}
} public void Execute(object parameter)
{
_execute();
}
}

以上学习取自:

http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial

http://www.cnblogs.com/whj198579/archive/2013/03/18/2966881.html

WPF学习之路一的更多相关文章

  1. WPF学习之路初识

    WPF学习之路初识   WPF 介绍 .NET Framework 4 .NET Framework 3.5 .NET Framework 3.0 Windows Presentation Found ...

  2. WPF学习之路(一) 初识WPF

    参考<葵花宝典-WPF自学手册> VS2012 先创建第一个WPF小程序 1.创建WPF程序 2.查看Solution,WPF中xaml文件和cs文件经常成对出现 两个主要的类:APP(W ...

  3. WPF学习之路(十四)样式和模板

    样式 实例: <Window.Resources> <Style x:Key="BtnStyle"> <Setter Property=" ...

  4. WPF学习之路(十三)URL

    URL一般由三个部分组成,协议.资源所在主机地址.资源路径 WPF中URL同样有三部分组成:pack.authority(application:| siteoforigin:).路径 资源文件 本地 ...

  5. WPF学习之路(十二)控件(Items控件)

     ListBox 提供了一个选项列表,可以固定或者动态绑定 <StackPanel> <GroupBox Margin="> <GroupBox.Header& ...

  6. WPF学习之路(九)导航和页面(续)

    生命周期 如果Page1成功导航到Page2,首先会触发NavigationService的Navigating事件,标识导航开始.随后创建Page2对象,并且触发NavigationProgress ...

  7. WPF学习之路(九)导航链接

    Hyperlink WPF中超链接类型是Hyperlink,除了能在页面之间导航,还能再同一个页面下进行段落导航 实例: <Grid> <FlowDocumentReader> ...

  8. WPF学习之路(八)页面

    传统的应用程序中有两类应用程序模式:桌面应用,Web应用.WPF的导航应用程序模糊了这两类应用程序的界限的第三类应用程序 WPF导航表现为两种形式,一是将导航内容寄宿于窗口,二是XAML浏览器应用程序 ...

  9. WPF学习之路(七)应用程序和窗口(续)

    窗口的生命周期 WPF中一个Window类代表一个窗口 一个的窗口的生命周期也有好几个阶段: 1.构造器被调用 2.Window.Initialized事件被触发 3.Window.Activated ...

随机推荐

  1. ubuntu mount u盘以及cp拷贝文件夹

    如果是ubuntu桌面环境的话,不用mount,接入的U盘就可以直接被系统识别,访问起来非常方便,但如果没有桌面环境呢,比如在ubuntu server端,如何访问U盘呢? 第一步:查看U盘信息sud ...

  2. 通用table样式

    <html> <head> <title>通用table样式</title> <style type="text/css"&g ...

  3. 大数据算法设计模式(2) - 左外链接(leftOuterJoin) spark实现

    左外链接(leftOuterJoin) spark实现 package com.kangaroo.studio.algorithms.join; import org.apache.spark.api ...

  4. 【记录】Spring项目转化为Spring Web项目

    前言 在将Spring项目转化为Spring Mvc项目时出现了点问题,总是无法成功部署,查阅资料也并没有找到一个完美的解决方案,最后是参考在idea中创建maven web app项目后的目录才成功 ...

  5. python3.6安装pyspider

    win10下安装pyspider 1.pip 我在安装pip的时候默认安装了Pip. 如果没有的话:pip安装 2.PhantomJS PhantomJS 是一个基于 WebKit 的服务器端 Jav ...

  6. Android 发展史

    1. 概述 http://zh.wikipedia.org/wiki/Android# 2. Android版本发布表 Time Code name Version API level  2014年1 ...

  7. Java并发之CountDownLatch、CyclicBarrier和Semaphore

    CountDownLatch 是能使一组线程等另一组线程都跑完了再继续跑:CyclicBarrier 能够使一组线程在一个时间点上达到同步,可以是一起开始执行全部任务或者一部分任务. CountDow ...

  8. IDEA + Maven + JavaWeb项目搭建

    前言:在网上一直没找到一个完整的IDEA+Maven+Web项目搭建,对于IDEA和Maven初学者来说,这个过程简单但是非常痛苦的,对中间的某些步骤不是很理解,导致操作错误,从而项目发布不成功,一直 ...

  9. jstl 中 <c:foreach> 多级循环

  10. javascript的一些算法的实用小技巧

    一.交换两个数字的值 我们交换两个数字的值想到的方法一般就是用一个新的变变量,让他把一个数存起来,然后在交换两个数字的值,看下面这种. var a = 1, b = 2; //交换两个数字的值 var ...