变更通知是WPF的一个精髓,它使得MVVM成为WPF的标准架构!在数据绑定中,除了正常的数据模版绑定,还会涉及到模板内控件的事件绑定,以及对parent内容的绑定!接下来的示例将会展示大部分常用的绑定场景。
示例实现的是一个便签软件,主要功能有新增、删除、修改、切换日期、读取便签列表、设置是否完成。
下面先说下几种绑定方式:
继承于ICommand和INotifyPropertyChanged的事件委托和通知变更类这里就不写了,网上很多的!或者你可以直接使用mvvmlight的框架。
在App.xaml中加入资源NoteViewModel,方便在blend中绑定
打开blend,如果不习惯用blend,可以参考后面的xaml代码自己编写!
1、模板数据绑定,这是最基础的绑定,通过blend可以实现
1.1 绑定window的datacontext
1.2绑定listbox的itemsource
1.3、右键Listbox > 编辑其他模版 > 编辑生成的项 > 创建新项,拖入一个checkbox和textblock,并绑定相对应的字段。如果需要字段转换,最常用的是bool和visible等,可以自己写convert转换器,具体写法自行百度。
1.4 通过“行为”来控制,文本框是否可编辑!原本是只读模式,在双击后可以进行编辑,只展示一个示例,其他的在代码中找!
2、模版父控件的绑定
下面需要绑定checkbox的点击事件来设置该项任务是否完成。在blend中可以看到,在模板的数据绑定中只能显示notemodel中的字段,这是因为item的datacontext类型为NoteModel。我们想绑定NoteViewModel中的CompleteCommand事件,就需要自行指定绑定的数据源。这需要通过代码实现:
msdn的RelativeSource:http://msdn.microsoft.com/zh-cn/library/system.windows.data.binding.source(v=vs.90).aspx
RelativeSource成员:http://msdn.microsoft.com/zh-SG/library/system.windows.data.relativesource_members(v=vs.85)
RelativeSource的AncestorType:http://msdn.microsoft.com/zh-SG/library/system.windows.data.relativesource.ancestortype(v=vs.85)
这几篇文章读完就能掌握常用的几种绑定方式了。
3、模板绑定某一元素的属性(通过RelativeSource查找)
AncestorLevel来确定向上查找的级别,AncestorType确定要查找的元素!这点很类似于JQuery的Selector。
以上就是几种常用的绑定方式。
下面贴上部分源码:
NoteWindow.xaml
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ManageNote.Model;
using System.Data;
using MySql.Data.MySqlClient;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Input;
namespace ManageNote.ViewModel
{
public class NoteViewModel : NotificationObject
{
DateTime currentDate;
private DelegateCommand completeCommand;
///
/// 设置完成状态事件
///
public DelegateCommand CompleteCommand
{
get
{
if (this.completeCommand == null)
{
this.completeCommand = new DelegateCommand(this.SetComplete);
}
return this.completeCommand;
}
}
private DelegateCommand delPlan;
///
/// 删除计划事件
///
public DelegateCommand DelPlan
{
get
{
if (this.delPlan == null)
{
this.delPlan = new DelegateCommand(this.Delete);
}
return this.delPlan;
}
}
private DelegateCommand