【全面解禁!真正的Expression Blend实战开发技巧】第七章 MVVM初体验-在DataGrid行末添加按钮
原文:【全面解禁!真正的Expression Blend实战开发技巧】第七章 MVVM初体验-在DataGrid行末添加按钮
博客更新较慢,先向各位读者说声抱歉。这一节讲解的依然是开发中经常遇到的一种需求,在DataGrid行末添加按钮。请看下图。

上图中"功能"这一列里显示的并不是数据,而是一个TextButton。当点击它时,对应的进行删除操作。这里为了大家看的明显果,我在点击按钮后,弹出当前选中行的"Name"属性。当然你也可以对行内数据进行增删改查等各种操作。除此之外,他还可以充分适应分辨率及IE大小。

上图中,当IE缩小到一定程度后,DataGrid会自动产生水平滚动条,只要向右边拖,就可以看到我们的删除按钮。看起来本来就应该是这样不是么?但实际的情况中,我见过的一些项目的做法往往都是错误的,他们不能自适应IE大小,当IE宽度缩短时,删除按钮就消失了。错误的效果,如下图所示.

上图中是错误的做法,当IE窗口缩小后,即使滚动条拖到最右边,依然看不到删除按钮。并且,删除这一列不能显示列名。
这次的课程可能稍微复杂,涉及到后台代码,及一些MVVM的手法。但请相信我,熟练掌握后,实现这样的DataGrid,3分钟足够了。好了,不废话了,请大家打开Blend,一起跟我做。首先新建一个项目,拖拽一个DataGrid到你的LayoutRoot中。然后新建一个示例数据源,如下图所示:(关于如何新建示例数据源,请参考: 第六章 认识ListBox)

上图中我们的示例数据源只有两个属性,number型的Age和String型的Name。接下来,请直接拖拽Collection节点到DataGrid上。如果你操作完全正确,会得到下图中的效果。

接下来,在Object an TimeLine面板中,展开DataGrid节点,可以看到两个DataGridTextColumn,如果你把Name拖到Age上面,DataGrid的列就是按"Name"->"Age"的顺序显示。

你还可以通过修改它们的Header属性,将英文"Age","Name"变成"年龄","姓名",

接下来,请点击属性面板左侧的
按钮,切换到代码和设计视图。

随后你可以看到DataGrid的代码是这样的.

接下来需要手写一段代码。
<sdk:DataGridTemplateColumn Header="功能"/>
将这段代码写在两个DataGridTextColumn后面。

然后,先不要急着运行程序,此时运行会提示一个错误,"DataGridTemplateColumn必须指定一个Template"。所以,我们还需要为它定义一个模板。
在Object and Timeline面板中,右击我们新建的列,在弹出菜单中选择Edit Column Templates->Edit CellTemplate->Create Empty

在弹出面板中为模板取一个名字,然后点击OK按钮会进入模板编辑视图,如下图所示。

接下来,只需要在这个Grid中添加一个按钮即可,在Demo中我使用的是TextButton。(关于TextButton的做法,请参考: 第三章 从最常用ButtonStyle开始 - TextButton),然后结束编辑,退出模板编辑视图。我们可以看到一个TextButton已经被正确的植入DataGrid。

看起来很不错不是么?不过现在这个删除按钮还不能响应任何事件,接下来来我们需要一些真正的Coding工作。使用MVVM的手法彻底分离UI和Code,并调用按钮的点击事件,弹出当前选中行的信息。
首先请在Project菜单中右击解决方案节点,在弹出菜单中选择Edit in Visual Studio。下面的coding工作会在VS2010中进行。讲到这里有人可能会问,“Blend不是也可以写代码么?为什么还要打开VS?” 这里我多说一嘴,Blend在设计方面的能力是毋庸置疑的,但coding还是要用VS,相信我不要用Blend写任何C#或VB编码,Blend弱智且低能的语法提示会恶心死你。

在VS中,新建一个Class,名为MyCommand。

MyCommand中的代码如下,大家可以直接拷贝。
public class MyCommand
{
public ICommand ShowInfoCommand
{
get;
private set;
}
public MyCommand()
{
this.ShowInfoCommand = new ActionCommand(this.ShowInfo);
}
private void ShowInfo(object selectedItem)
{
Expression.Blend.SampleData.SampleDataSource.Item item = selectedItem as Expression.Blend.SampleData.SampleDataSource.Item;
MessageBox.Show(item.Name.ToString());
}
}
如果你在为ActionCommand添加引用的时候,提示找不到这个类型。请引用
后再试。接下来,F6编译一下工程,编译通过后用Vs打开我们刚才编辑的Xaml,在UserControl标签中输入下面代码。(注意此处的Lession7是我自己项目的命名空间名,此处你需要将它替换为你自己的项目命名空间名。)
xmlns:local="clr-namespace:Lession7"。
接着在UserControl.Resources标签中输入下面代码。
<local:MyCommand x:Key="MyCommand" d:IsDataSource="false"/>
输入后的效果如下图所示。

然后再VS中按Ctrl+F,弹出搜索菜单,搜索关键字“删除”。注意,搜索范围是CurrentDocument,而不是整个解决方案。然后你可以定位到刚才我们在DataGrid中添加的哪个删除按钮。

把下面代码添加到“删除”按钮中。
Command="{Binding ShowInfoCommand, Mode=OneWay,Source={StaticResource MyCommand}}" CommandParameter="{Binding Mode=OneWay}"
添加后的效果如下图所示

点击F5运行程序,恭喜各位,大功告成!

背后的故事:
本章中涉及的知识较多,如果你是一个美工或者设计人员。可能会感觉只是照着做出来了,但很多原理都不懂。下面我简单对一些关键点做讲解。
在MyCommand类中,我们定义了一个名为ShowInfoCommand。因为他是一个“指令”,所以我们可以将它与任何控件的点击事件进行捆绑。本章中就将它捆绑到了“删除”按钮上。在ShowInfo(object selectedItem)方法中,我们通过强制转换selectedItem,得到了当前选中行的内容。本例中因为使用的示例数据源,所以用的是Expression.Blend.SampleData.SampleDataSource.Item类型。在实际项目中,你需要将它换位DataGrid数据源的实际类型。
如何将MyCommand与Xaml中的Button绑定?
第一步在Xaml中定义关于MyCommand的引用。代码是:xmlns:local="clr-namespace:Lession7" ,注意"Lession7"是项目命名空间名。
第二步在UserControl.Resource标签中声明一个xaml可以引用的对象。代码是<local:MyCommand x:Key="MyCommand" d:IsDataSource="false"/>
“d:IsDataSource="false"“标识我们声明的不是一个数据源。这个信息主要是给Blend用的,不是必须的。
第三步就是在“删除”按钮中写的那段代码了,将Button的Command属性与我们声明的MyCommadn绑定。
项目源码下载地址http://files.cnblogs.com/kaodigua/Lession7.rar
博客我会坚持写,只是更新时间不一定。有空了我一定会连续更新。希望大家一直支持我。如果你喜欢我的文章,请点一下文章右下角的“推荐”,谢谢。
【全面解禁!真正的Expression Blend实战开发技巧】第七章 MVVM初体验-在DataGrid行末添加按钮的更多相关文章
- 【全面解禁!真正的Expression Blend实战开发技巧】十一章 全面解析布局(Grid & Canvas &StackPanel &Wrappanel)
原文:[全面解禁!真正的Expression Blend实战开发技巧]十一章 全面解析布局(Grid & Canvas &StackPanel &Wrappanel) 写这篇文 ...
- 【全面解禁!真正的Expression Blend实战开发技巧】第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条
原文:[全面解禁!真正的Expression Blend实战开发技巧]第九章 FluidMoveBehavior完全解析之二平滑运动的滚动条 这一章讲解FluidMoveBehavior的另一个应用, ...
- 【全面解禁!真正的Expression Blend实战开发技巧】第二章 你好,UI设计师
原文:[全面解禁!真正的Expression Blend实战开发技巧]第二章 你好,UI设计师 你好,UI设计师 曾几何时我从没想过要与艺术家打交道,但是Silverlight改变了这一切.UI设计师 ...
- 【全面解禁!真正的Expression Blend实战开发技巧】第一章 真正的开发中的最佳的做法
原文:[全面解禁!真正的Expression Blend实战开发技巧]第一章 真正的开发中的最佳的做法 从设计者到开发者 设计师创建一个应用程序的布局然后让开发者去实现. 从开发者到设计者 开发者创建 ...
- 【全面解禁!真正的Expression Blend实战开发技巧】序章
原文:[全面解禁!真正的Expression Blend实战开发技巧]序章 从silverlight2开始我也和大家一样一直在跟随微软的脚步,从sl2~sl4一步一步过来,总结了不少心得体会.由于各种 ...
- 【全面解禁!真正的Expression Blend实战开发技巧】第十章 FluidMoveBehavior完全解析之三飞出ListBox吧
原文:[全面解禁!真正的Expression Blend实战开发技巧]第十章 FluidMoveBehavior完全解析之三飞出ListBox吧 刚才有人说我的标题很给力,哈哈.那这个标题肯定更给力了 ...
- 【全面解禁!真正的Expression Blend实战开发技巧】第八章 FluidMoveBehavior完全解析之一漂浮移动
原文:[全面解禁!真正的Expression Blend实战开发技巧]第八章 FluidMoveBehavior完全解析之一漂浮移动 好久没更新博客了,今天如果没急事,准备连发三篇,完全讲解Blend ...
- 【全面解禁!真正的Expression Blend实战开发技巧】第四章 从最常用ButtonStyle开始 - PathButton
原文:[全面解禁!真正的Expression Blend实战开发技巧]第四章 从最常用ButtonStyle开始 - PathButton 上一篇我们介绍了TextButton,但为了追求界面的张力, ...
- 【全面解禁!真正的Expression Blend实战开发技巧】第五章 从最常用ButtonStyle开始 - ImageButton
原文:[全面解禁!真正的Expression Blend实战开发技巧]第五章 从最常用ButtonStyle开始 - ImageButton 本章围绕ImageButton深入讨论,为什么是Image ...
随机推荐
- <Linux> Xen虚拟机下挂载
//创建源vdisk挂载目录: mkdir vd1 //创建目标vdisk挂载目录: mkdir vd2 //只需第一次执行: iscsiadm -m discovery --type sendta ...
- Mac OSX 下配置 LNMP开发环境
不久前负责了一个项目需要配置PHP7的开发环境,因为之前所有的项目用的是PHP5的,所以研究了这些东西,但是很遗憾,电脑出了问题,不得已重装了系统,然后你懂得...什么都没有了,要重新来过.. 虽然本 ...
- protobuf入门教程
1.简介和安装 2.消息类型 3.proto3 与 proto2 的区别 4.常用序列化/反序列化接口 5.repeated限定修饰符 6.枚举(enum).包(package) 7.导入定义(imp ...
- [javase学习笔记]-6.6 基本数据类型參数与引用数据类型參数的传递过程
这一节基本数据类型參数和引用数据类型參数的传递过程. 数据类型參数和引用參数我们在前面章节中都已涉及到了,那么我们来看看以下的两段代码: //基本数据类型參数传递 class Demo { publi ...
- OOA/OOD/OOP 转载
OOA/OOD/OOP OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA与结构化分析有较 ...
- 关系型数据库工作原理-快速缓存(翻译自Coding-Geek文章)
本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...
- app.config中的值获取及设置 以及对log4net配置
修改或新增AppSetting节点 /// <summary> /// 修改AppSettings中配置 /// </summary> /// <param name ...
- 【30.00%】【vijos 1909】寻找道路
描述 在有向图 G 中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到 终点的路径,该路径满足以下条件: 路径上的所有点的出边所指向的点都直接或间接与终点连通. 在满足条件 1 的情 ...
- Jdbc连接MySQL 8时报错“MySQLNonTransientConnectionException: Public Key Retrieval is not allowed”
一.问题 因停电检修,今天重启服务器后,再启动jboss就报错"MySQLNonTransientConnectionException: Public Key Retrieval is n ...
- Matlab Tricks(三十) —— 任意区间的均匀分布
matlab 的内置函数 rand返回的是 0-1 区间上的均匀分布,rand的参数多是用于设置返回的矩阵的维度大小. 如果要得到 (a, b) 区间上的均匀分布,只需对其做简单的线性变换即可: a+ ...