通常在一些情况下,我们需要把绑定到UI的数据做一些格式的特定转换,例如转换时间格式。而在这个情况下就需要使用Silverlight的数据转换功能(当然用其它方法也可以我们在这里只是体现Silverlight数据转换功能),在Silverlight中任何绑定数据都可以实现数据转换。要实现数据转换首先要创建数据转换类,然后要继承IValueConverter接口并实现接口的Convert和ConvertBack方法,当数据源传递数据到目标时调用Convert方法反之则调用ConvertBack方法。ConvertBack方法不可省略,下面我们来看IValueConverter接口的两个方法的定义
Convert:
@H_502_13@/// <summary> /// 摘要: // 在将数据源传递到UI时进行数据修改。 /// </summary> /// <param name="value">正传到目标的数据源</param> /// <param name="targettype">目标依赖项属性需要的数据的System.Type</param> /// <param name="parameter">要在转换器逻辑中使用的可选参数</param> /// <param name="culture">转换的区域性</param> /// <returns> 传递到目标依赖的项属性的值</returns> object Convert(object value,Type targettype,object parameter,CultureInfo culture);
然后是ConvertBack:
@H_502_13@ /// <summary> /// 摘要: /// 将目标数据传到源对象之前对值进行修改此方法 /// 仅在System.Windows.Data.BindingMode.TwoWay绑定中调用 /// </summary> /// <param name="value">正传到源的目标数据</param> /// <param name="targettype">源对象需要的数据的System.Type</param> /// <param name="parameter">要在转换器逻辑中使用的可选参数</param> /// <param name="culture">转换的区域性</param> /// <returns> 要传到源对象的值</returns> object ConvertBack(object value,CultureInfo culture);
下面是 例子,首先创建一个Convert类,然后让这个类继承自IValueConverter接口,要用IValueConverter接口要引用System.Windows.Data命名空间。
代码如下:
@H_502_13@public class Converter : IValueConverter { #region IValueConerter成员 public object Convert(object value,System.Globalization.CultureInfo culture) { return DateTime.Parse(value.ToString()).ToString("yyyy年MM月dd日"); } public object ConvertBack(object value,System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion }
这个Convert只是实现了时间的转换将时间转换成yyyy年MM月dd日的形式,例子很简单只是为了体现Silverlight的数据转换功能。
然后要在XAML里面加入myConvert作用前要在UserControl中添加命名空间xmlns:my="clr-namespace:Propject1.s02",添加的命名空间中Propject1是我的项目的名字s02是我的Converter类所在的文件夹的namespace,所以朋友们需要把Propject1.s02换成自己的项目解决方案名字,一定要引用到Convert所在目录那一级哦。
前台界面如下:
XAML
@H_502_13@<StackPanel x:Name="LayoutRoot" Background="White"> <StackPanel.Resources> <!--引用对象--> <my:Converter x:Key="myConvert"/> </StackPanel.Resources> <sdk:DatePicker x:Name="datep" Margin="5" FontSize="15" Width="200" Height="30" /> <TextBlock x:Name="txb_Date" Width="200" FontSize="15" Height="30" Text="{Binding Date,Mode=TwoWay,Converter={StaticResource myConvert}}" /> </StackPanel>
创建Book_Convert 代码:
@H_502_13@ public class Book_Convert : INotifyPropertyChanged { private string _date; /// <summary> /// 日期 /// </summary> public string Date { get { return _date; } set { _date = value; NotifyProperyChanged("Date"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyProperyChanged(string PropertyName) { if (PropertyChanged != null) { PropertyChanged(this,new PropertyChangedEventArgs(PropertyName)); } } }
UI后台:
@H_502_13@ Book_Convert convert = new Book_Convert(); public DataConvert() { InitializeComponent(); datep.SelectedDateChanged += new EventHandler<SelectionChangedEventArgs>(datep_SelectedDateChanged); convert.Date = DateTime.Now.ToString(); txb_Date.DataContext = convert; } void datep_SelectedDateChanged(object sender,SelectionChangedEventArgs e) { convert.Date = datep.SelectedDate.ToString(); }
运行如图所示:
未使用Convert前:
然后使用Convert后:
例子是很简单,大家可以变通一下IValueConverter接口中不是有System.Type参数吗。大家可以根据这个类型来判断是要进行什么转换,然后再调用转换方法就行了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。