看一个例子,FontFamily="Trebuchet MS, GlobalSansSerif.CompositeFont" 。这样一条简单的语句,熟悉WPF的人在xaml中可能经常使用。问题是为什么,WPF能将一个string类型的值,赋值给FontFamily类型。

答案:WPF团队在实现XAML语言的时候,为了使用户能像使用HTML语法一样方便,在WPF中集成了很多的转换器,它们能将String值转化为各种类型,赋值给Control的各个属性。

进一步讨论,本人使用C#4年,WPF3年。个人一点点浅见,MS的WPF的确为用户考虑了很多,原来很多复杂的功能,现在仅仅几条语句就能实现,MS力求用强大的FrameWork,降低对程序员能力的要求(改变过去C++的思路),进而用户在初步接触WPF时有种随心所欲的感觉。但是要记住:凡是越方便的,出了问题后,结果越难查找。例如之前说过的WebBrowser内容不可见的问题(请参看WPF WebBrowser 不可见问题的解析)。

原因在于你不知道MS的很多内部实现原理,当用户习惯方便的使用WPF各种强大功能时,便慢慢养成对一个问题不求甚解的习惯。那么在编程时往往不能实现真正的随心所欲。

进入正题,不就是一个值转换吗,值得展开吗。我认为是值得的。且看一下代码(摘自MSDN):

namespace Converter

{

[ValueConversion(typeof(DateTime), typeof(String))]
public class DateConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
DateTime date = (DateTime)value;
return date.ToShortDateString();
} public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string strValue = value as string;
DateTime resultDateTime;
if (DateTime.TryParse(strValue, out resultDateTime))
{
return resultDateTime;
}
return DependencyProperty.UnsetValue;
}
} } Xaml: xmlns:src="clr-namespace:Converter" <src:DateConverter x:Key="dateConverter"/> ................... <TextBlock Grid.Row="2" Grid.Column="0" Margin="0,0,8,0"
Name="startDateTitle"
Style="{StaticResource smallTitleStyle}">Start Date:</TextBlock>
<TextBlock Name="StartDateDTKey" Grid.Row="2" Grid.Column="1"
Text="{Binding Path=StartDate, Converter={StaticResource dateConverter}}"
Style="{StaticResource textStyleTextBlock}"/> 分析: 在xaml中设置TextBlock Text="{Binding Path=StartDate, Converter={StaticResource dateConverter}}" 其中StartData是后台中的一个属性,类型为任意,当为String是可以直接绑定,当为其他值是就需要Converter来实现转换。这也就是实现IValueConverter的意义。 实现IValueConverter接口主要是 实现 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 其中: Convert实现后台值向UI显示的值 之间的转换 ConvertBack实现UI显示值向后台值 之间的转换。 再来看看IMultiValueConverter,它和IValueConverter类似,不同在于,IMultiValueConverter可实现有几个后台值综合决定前台UI显示的值。 public class DragDropListBox_ViewportSizeConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
double u = 0.12;
double ThumbHeight = 94;
if (double.Parse(values[2].ToString()) != double.NaN)
{
u = ThumbHeight / double.Parse(values[2].ToString());
}
double size = 0;
double Max = double.Parse(values[0].ToString());
double Min = double.Parse(values[1].ToString());
size = (Max - Min) * u / (1 - u);
return size;
} public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return null;
}
} 此例实现Scrollbar外观的定义,size的值由object[] values数组中的值综合决定。这里不做展开,在后续控件重写中将详细介绍。 好了,说那么多,希望大家能了解一点,WPF虽功能强大,但是程序员仍然要了解WPF的实现机制,顺着它的实现原理,那么WPF能让你随心所欲。如果不求甚解。常常会一头雾水。。 在WPF进阶之接口系列中我们将介绍重要的WPF接口,,在其中将穿插讲解部分WPF内部原理 下一节中我们将向大家介绍IDispose,ICollectionView接口

http://hi.baidu.com/leo_han/item/ebd7361e436d397e7a5f250a 转自

WPF进阶之接口(1):IValueConverter,IMultiValueConverter的更多相关文章

  1. WPF进阶之接口(4):ICommand实现详解

    上一章WPF进阶之接口():INotifyPropertyChanged,ICommand中我们遗留了几个问题,我将在本节中做出解释.在详细解释ICommand实现之前,我们现在关注一下什么是:弱引用 ...

  2. WPF进阶之接口(3):INotifyPropertyChanged,ICommand

    INotifiPropertyChanged . 作用:向客户端发出某一属性值已更改的通知.该接口包含一个PropertyChanged事件成员(MSDN的解释) INotifyPropertyCha ...

  3. WPF进阶之接口(2):IDisposable,ICollectionView

    废话不多说,进入正题,先来说说IDisposable,看例子(来自MSDN): using System; using System.ComponentModel; // 下面的例子将展示一个实施了I ...

  4. WPF使用IDataErrorInfo接口进行数据校验 - 简书

    原文:WPF使用IDataErrorInfo接口进行数据校验 - 简书 class ValidationBindableBase : BindableBase, IDataErrorInfo { pu ...

  5. WPF进阶教程 - 使用Decorator自定义带三角形的边框

    原文:WPF进阶教程 - 使用Decorator自定义带三角形的边框 写下来,备忘. Decorator,有装饰器.装饰品的意思,很容易让人联想到设计模式里面的装饰器模式.Decorator类负责包装 ...

  6. WPF进阶技巧和实战03-控件(3-文本控件及列表控件)

    系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实 ...

  7. WPF进阶技巧和实战03-控件(4-基于范围的控件及日期控件)

    系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实 ...

  8. WPF进阶技巧和实战08-依赖属性与绑定03

    数据提供者 在大多数的代码中,都是通过设置元素的DataContext属性或者列表控件的ItemsSource属性,从而提供顶级的数据源.当数据对象是通过另一个类构造时,可以有其他选择. 一种是作为窗 ...

  9. WPF进阶技巧和实战03-控件(5-列表、树、网格02)

    数据模板 样式提供了基本的格式化能力,但是不管如何修改ListBoxItem,他都不能够展示功能更强大的元素组合,因为了每个ListBoxItem只支持单个绑定字段(通过DisplayMemberPa ...

随机推荐

  1. HTTP标头信息

    HTTP头信息头信息由“键:值”组成.它们描述客户端或者服务器的属性.被传输的资源以及应该实现连接. 四种不同类型的头标 通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联 ...

  2. 51单片机晶振11.0592M延时函数

    /********************************************** º¯ÊýÃû£ºdelay_ms(uint z) ÑÓʱº¯Êý(12MHZ¾§Õñ) ´Ëº¯ÊýÑ ...

  3. 各种Map的区别,想在Map放入自定义顺序的键值对

    今天做统计时需要对X轴的地区按照地区代码(areaCode)进行排序,由于在构建XMLData使用的map来进行数据统计的,所以在统计过程中就需要对map进行排序. 一.简单介绍Map 在讲解Map排 ...

  4. powerdesigner 画ER图

    ER图 即为 CDM图 - Conceptual Data Modal CDM可以转换成PDM.OOM.LDM等图,具体请详查 一般,CDM图示在概要设计阶段创建,PDM图示根据CDM图的基础上产生的 ...

  5. mysql 字面值

    mysql 数据库中实现了许多的数据类型.通常我们用的最多的是在建表的时候指定列的数据类型 如:brithday date default '2000-01-01' 那么我们如何给字面值(直接量)指定 ...

  6. Go语言核心之美 4.3-多返回值

    在Go语言中.函数能够有多个返回值,这个特性我们已经在之前的样例见过非常多,非常多标准库函数都会返回两个值,一个是期望得到的函数执行结果,另外一个是函数出错时的错误值. 以下的程序是findlinks ...

  7. atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结

    atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结 1. 建立AST 抽象语法树 Abstract Syntax Tree,AST) 1 ...

  8. sass 的使用心得

    //定义颜色 $c55:#; $c22:#; $c33:#; $c99:#; $c77:#; $c00:#; $cff:#fff; $caa:#aaa; $ccc:#ccc; $cf0:#f0f0f0 ...

  9. apue编程之参考df代码写的一个简单的df命令的源代码

    代码: #include <stdio.h> #include <mntent.h> #include <string.h> #include <sys/vf ...

  10. Activiti工作流简单入门 (zhuan)

    https://my.oschina.NET/Barudisshu/blog/309721 *********************************************** 摘要: 自j ...