深入浅出WPF第三辑数据的绿色通道Binding(中)

上传人:平*** 文档编号:12791222 上传时间:2017-10-20 格式:DOC 页数:6 大小:81KB
返回 下载 相关 举报
深入浅出WPF第三辑数据的绿色通道Binding(中)_第1页
第1页 / 共6页
深入浅出WPF第三辑数据的绿色通道Binding(中)_第2页
第2页 / 共6页
深入浅出WPF第三辑数据的绿色通道Binding(中)_第3页
第3页 / 共6页
深入浅出WPF第三辑数据的绿色通道Binding(中)_第4页
第4页 / 共6页
深入浅出WPF第三辑数据的绿色通道Binding(中)_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《深入浅出WPF第三辑数据的绿色通道Binding(中)》由会员分享,可在线阅读,更多相关《深入浅出WPF第三辑数据的绿色通道Binding(中)(6页珍藏版)》请在金锄头文库上搜索。

1、深入浅出 WPF 第三辑数据的绿色通道,Binding(中)小序:今天中午吃完饭回工位的路上,和俺们组资深的 Level 2 技术支持肖老师聊了几句。我跟肖老师说,最近我在学习 Binding,肖老师说那可不是个好东西!因为如果在程序中使用了 Binding,当出现错误的时候,比较难于调试。道理很简单以前使用事件(C+ 里是回调)的时候,能明确地在事件处理函数里去跟踪调试,现在使用 Binding,数据源和 UI 之间是一支封闭的“ 管道”,在代码中很难看到他们是在哪里关联上的、出了问题也不知道在哪里拦截、设断点。这的确是个问题!我又去请教了别的同事。Allen 同学告诉我,在 Binding

2、 和数据目标(的 Dependency Property)有一些事件,会在数据有传输的时候被激发,或者在 Binding 的 Converter 和 Validator 上下下功夫。看来 Binding 值得研究的地方还真多呀!文章的篇幅毕竟有限,我只能捡工作当中用的最多的来介绍。那么,我还有哪些东西需要介绍呢? 让数据“为我所用”的 Converter 让数据“干干净净”的 Validation 集合控件与集合数据的 Binding 偷懒专用的数据中转站DataContext 希望我的工作能给大家搭起一个良好的学习框架全面细致的内容尽在 MSDN 里,请大家阅读的时候会轻松一些。正文: 不拘

3、一格用数据的 Converter上篇文已经说明,Binding 就是数据源与目标之间的 “关联” 。大多数情况下,数据从 Source 到 Target 以及从 Target 返回 Source 都是“直来直去”的,但有些场景却需要我们对数据做些转换才能为我所用。举两个典型的例子: 如果数据源里的值是 Y 和 N,如果是 Y,那么 UI 上的 CheckBox 就被勾选,否则就不勾选,这就需要我们把 string(也许是 char)类型的数据转换成 bool?类型再使用。如果 Binding 是 TwoWay 的,CheckBox 的勾选操作还会把值传回数据源。 如果“评论内容”TextBox

4、 里没有内容,则“提交”Button 不可以点击。这是个典型的 OneWay 数据 Binding,因为只有TextBox 去影响 Button 的份儿。具体如何实现,大家可以先猜猜;) 想要实现这类的转换,就需要为 Binding 这个 “绿色通道” 设置“关卡”,这里我们用到的关卡就是“数据转换器” (Data Converter)。Converter 实际上就是一个类,它这个类有个要求 它需要实现 IValueConverter 这个接口。这个接口的内容非常简单 只有两个方法,它们分别是: Convert 方法:按照你的要求,把从数据源传来的数据转成你想要的数据至于是加减乘除还是煎炒炸炖

5、,那就要看你怎么实现函数体了 ConvertBack 方法:如果 Binding 是 TwoWay 的,那么数据目标会回传经用户改动后的数据,这时候你就不得不把数据转换回数据源里的格式大多数情况下,它是 Convert 方法的逆运算,具体情况还要具体分析。(不过,熟饭估计怎么着也变不成生米了,呵呵) 下面是第一个例子的核心代码,我来一步一步实现。第一步:先声明一个类。我的习惯是用 Converter 开头,后缀是“ 源类型 2 目标类型”,这里的“2”是“to”的意思。view plaincopy to clipboardprint?1. class ConverterYN2TF 2. 3.

6、4. 第二步:让这个类实现 IValueConverter 接口。这里有个使用 VS2008 的小窍门 在类名后写上“: IValueConverter”后,按下键盘上的“Shift+Alt+F10”会弹出 VS2008 的智能菜单,选择其中的第一项“ 实现 IValueConverter 的方法”,VS2008 会自动为我们生成需要实现的方法体:view plaincopy to clipboardprint?1. class ConverterYN2TF : IValueConverter 2. 3. #region IValueConverter Members 4. 5. public

7、 object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 6. 7. throw new NotImplementedException(); 8. 9. 10. public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 11. 12. throw new NotIm

8、plementedException(); 13. 14. 15. #endregion 16. 第三步:添加 Attribute。这步不是必需的,但加上有是有好处的告诉 Converter 数据的源类型与目标类型各是什么。值得注意的是,CheckBox 的 IsChecked 属性是 bool?类型的(可空 bool 类型),意思是说可以是 True/False/Null 三种值,表现在 UI 上就是勾选/不勾选/中间态。如果想让 CheckBox 能显示中间态,需要把它的 IsThreeState 属性设为 True。view plaincopy to clipboardprint?1.

9、ValueConversion(typeof(string), typeof(bool?) /数据的源类型是 string,目标类型是 bool? 2. class ConverterYN2TF : IValueConverter 3. 4. 5. #region IValueConverter Members 6. 7. public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 8. 9. throw new NotImple

10、mentedException(); 10. 11. 12. public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 13. 14. throw new NotImplementedException(); 15. 16. 17. #endregion 18. 第四步:实现这两个方法。在开始动手前,我们先分析一下这两个方法的参数和返回值。首先,这两个方法的参数和返回值都是 object 类型的,之所以这样做,是因为接口

11、的设计者并不知道你要传入和传出的数据是什么类型的,只好用它们“绝对正确”的基类object 了。其次,对于 Convert 方法来说, value 是从数据源传来的数据,返回值是转换好后发送给数据目标的数据。对于 ConvertBack 方法正好反过来,value 是从数据目标(比如 UI)传回来的数据,返回值是要与数据源匹配的数据。再次,偶尔我们会用到 parameter 那个参数。比如在转换某些数据的时候,我们需要依赖一些其它的外部数据来辅助我们的数据转换,这时候就可以在 parameter 上打主意了。如果想传多个参数的话,可以把这些参数打包成数组或者 class/struct 等数据结

12、构再传进来。在我们工作的代码中用到过一次 parameter,我为我的 Converter 类准备了一个带参数的构造函数,把外部的辅助数据传给 Converter最后,如果你的 Binding 是 OneWay 的,那么恭喜你 你的 ConvertBack 函数体随便怎么实现都可以因为它不可能被调用。完成的类是这样的:view plaincopy to clipboardprint?1. ValueConversion(typeof(string), typeof(bool?) /数据的源类型是 string,目标类型是 bool? 2. class ConverterYN2TF : IVal

13、ueConverter 3. 4. public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 5. 6. string str = System.Convert.ToString(value); 7. switch (str) 8. 9. case Y: 10. return true; 11. case N: 12. return false; 13. default: 14. return null; 15. 16. 17.

14、 18. public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 19. 20. bool? b = System.Convert.ToBoolean(value); 21. switch (b) 22. 23. case true: 24. return Y; 25. case false: 26. return N; 27. default: 28. return Null; 29. 30. 31. 使用这个类的方法是将 Binding 实例的 Converter 属性设置为这个类的一个实例:view plaincopy to clipboardprint?1. checkBox1.IsThreeState = true; 2. Binding binding = new Binding(Text); 3. binding.Source = textBox1; 4. binding.Converter = new ConverterYN2TF(); / 设定 Converter

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号