12.4 使用值转换器
在控制数据呈现的过程中,往往需要将源数据经过转化后,再呈现出来。比如将一个RGBA类型的数据转化为string类型显示出来,将数据存储为浮点类型,但通过货币的形式呈现;还有将日期存储成DateTime格式,在界面上显示时使用Calender控件等。
Silverlight提供了一个值转换器,使数据实现了数据源和目标在不同数据类型间的转换。这种转换可以为不同类型数据做桥接,也可以用做自定义数据的显示。
创建值转换器,是创建一个实现IValueConverter接口的类。值转换器可以根据需要设置在任意的数据绑定上。
下面的实例是在上一节实例的基础上,给显示歌曲长度信息的数据绑定添加了值转换器,将TimeSpan类型的歌曲长度信息转化为自定义的格式显示出来。具体操作步骤如下。
(1)首先创建一个TimeSpanConverter类,使其继承IValueConverter接口。IValueConverter接口包含两个函数:Convert和ConvertBack。Convert函数表示从数据源到目标的值转换,ConvertBack函数表示从目标到数据源的值转换。因此,如果绑定模式是一次绑定或单向绑定,只需实现Convert函数;如果绑定模式是双向绑定,需要实现Convert和ConvertBack函数。
下面是TimeSpanConverter类的代码,在Convert函数中将TimeSpan类型的歌曲长度数据转化为string类型的数据,如例程12-15所示。
例程12-15 使用值转换
using System;usingSystem.Windows.Data;usingSystem.Globalization;namespaceBindingCollectionSamplepublic classTimeSpanConverter :IValueConverter
#region IValueConverter Mrs
public t Convert(t value, Type targetType,
t meter, CultureInfo culture)
TimeSpan length = (TimeSpan)value;
return length.Minutes.ToString() + “:”+length.Seconds.ToString();
//对于单向绑定而言,不需要实现ConvertBack
//只有双向绑定,才有必要实现ConvertBack
public t ConvertBack(t value, Type targetType,
t meter, CultureInfo culture)
throw new System.NotImplementedException();
#endregion
(2)创建了值转换器后,需要在数据绑定处添加该值转换器。打开MusicDetail.xaml,添加例程12-16所示的代码,给显示歌曲长度的TextBlock控件添加值转换器。
例程12-16 在数据绑定中使用值转换
<UserControlx:Class=”BindingCollectionSample.MusicDetail”xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”xmlns:local=”clr-namespace:BindingCollectionSample”><UserControl.Resources><local:TimeSpanConverterx:Key=”timeSpanConverter”/></UserControl.Resources><Canvasx:Name=”LayoutRoot”Background=”White”><TextBlockText=”歌曲:”FontSize=”22″Canvas.center=”130″Canvas.Top=”50″/><TextBlockText=”歌手:”FontSize=”22″Canvas.center=”130″ Canvas.Top=”100″/><TextBlockText=”长度:”FontSize=”22″Canvas.center=”130″Canvas.Top=”150″/>
<TextBlock x:Name=”name_tb”
Text=”Binding MusicName”
Canvas.center=”200″ Canvas.Top=”50″
FontSize=”22″/>
<TextBlock x:Name=”author_tb”
Text=”Binding Author”
Canvas.center=”200″ Canvas.Top=”100″
FontSize=”22″/>
<TextBox x:Name=”length_tb”
Text=”Binding Length,
Converter=StaticResource timeSpanConverter”
Canvas.center=”200″ Canvas.Top=”150″
FontSize=”22″/>
</Canvas>
</UserControl>
运行后的效果如图12-14所示,当选中《夜曲》时,从视图中的歌曲长度由原来的”00:03:46″转换为现在的”3:46″。
![]() |
图12-14 歌曲信息随ListBox
控件中的选择而改变
No tags

