前段时间一直在学习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学习之路一的更多相关文章
-
WPF学习之路初识
WPF学习之路初识 WPF 介绍 .NET Framework 4 .NET Framework 3.5 .NET Framework 3.0 Windows Presentation Found ...
-
WPF学习之路(一) 初识WPF
参考<葵花宝典-WPF自学手册> VS2012 先创建第一个WPF小程序 1.创建WPF程序 2.查看Solution,WPF中xaml文件和cs文件经常成对出现 两个主要的类:APP(W ...
-
WPF学习之路(十四)样式和模板
样式 实例: <Window.Resources> <Style x:Key="BtnStyle"> <Setter Property=" ...
-
WPF学习之路(十三)URL
URL一般由三个部分组成,协议.资源所在主机地址.资源路径 WPF中URL同样有三部分组成:pack.authority(application:| siteoforigin:).路径 资源文件 本地 ...
-
WPF学习之路(十二)控件(Items控件)
ListBox 提供了一个选项列表,可以固定或者动态绑定 <StackPanel> <GroupBox Margin="> <GroupBox.Header& ...
-
WPF学习之路(九)导航和页面(续)
生命周期 如果Page1成功导航到Page2,首先会触发NavigationService的Navigating事件,标识导航开始.随后创建Page2对象,并且触发NavigationProgress ...
-
WPF学习之路(九)导航链接
Hyperlink WPF中超链接类型是Hyperlink,除了能在页面之间导航,还能再同一个页面下进行段落导航 实例: <Grid> <FlowDocumentReader> ...
-
WPF学习之路(八)页面
传统的应用程序中有两类应用程序模式:桌面应用,Web应用.WPF的导航应用程序模糊了这两类应用程序的界限的第三类应用程序 WPF导航表现为两种形式,一是将导航内容寄宿于窗口,二是XAML浏览器应用程序 ...
-
WPF学习之路(七)应用程序和窗口(续)
窗口的生命周期 WPF中一个Window类代表一个窗口 一个的窗口的生命周期也有好几个阶段: 1.构造器被调用 2.Window.Initialized事件被触发 3.Window.Activated ...
随机推荐
-
在WPF中使用字体图标
一.源码描述 这是一款基于WPF窗体应用程序的字体图标示例源码, 该源码简单易懂使用于初学者和实战项目应用, 感兴趣的朋友们可以下载看看哦. 二.功能介绍 1.用ICO字体代替 ...
-
刀哥多线程同步任务作用gcd-07-sync_task
同步任务的作用 同步任务,可以让其他异步执行的任务,依赖某一个同步任务 例如:在用户登录之后,再异步下载文件! - (void)gcdDemo1 { dispatch_queue_t queue = ...
-
Linux Top使用说明
运行top后,按P键就按CPU排序,按M键就按内存排序 P – 以 CPU 占用率大小的顺序排列进程列表 M – 以内存占用率大小的顺序排列进程列表 在系统维护的过程中,随时可能有需要查看 CPU 使 ...
-
LVM管理
一.步骤: 1.创建新的分区,并修改分区类型为8e 2.创建物理卷PV 3.将新建的PV添加到要扩展的VG中 4.用命令lvextend或lvresize来将新加入的PE添加到要扩展的LV中 5.用命 ...
-
瞎捣鼓的code highlight
int a ; int b; public int a ;int b char c; h2 { text-align: left;}.postTitle{ background-color:#F ...
-
ajax和axios、fetch的区别
参考文章: https://www.jianshu.com/p/8bc48f8fde75 Fetch API是新的ajax解决方案,用于解决古老的XHR对象不能实现的问题. fetch是用来取代传统的 ...
-
centos7搭建时间服务器
时区概念 GMT.UTC.CST.DST UTC:整个地球分为二十四个时区,每个时区都有自己的本地时间,在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时间(UTC:Univers ...
-
安装和配置jBPM4,并举个hello.w
至于网上很复杂,但又不懂的插件,我们先不鸟他. myeclipse8\dropins这里就是给我们放插件的,类似SVN之类的.所以小生也修改了下,共享了下.只有放在目录下,打开应该可以的.下面是链接. ...
-
Uni2D 入门 -- Asset Table
转载 http://blog.csdn.net/kakashi8841/article/details/17686791 Uni2D生成了一个自定义的表格用于保存你资源的唯一ID的引用.这个表格用于更 ...
-
Android设置全局Context
新建一个java继承Application类 import android.app.Application; import android.content.Context; /** * 编写自定义Ap ...