熟悉数据绑定的朋友都知道,当我们在Model中获取一个对象的数据,常常需要对其进行数据转换后显示在UI界面上,比如你用bool类型存储了一个人的性别,但是在界面上却需要经过转化后显示为男或女;
今天又把数据绑定部分又看了一下,在这里就算是做个总结吧!
方法一:当我们定义一个类,该类中又有该类类型的一个属性,那么如果我们只是在XAML中使用简单的数据绑定的话,程序就会出现问题,究其原因就是程序无法正确对该类的对象的类类型的属性无法正确转化,所以我们需要自定义一个转换类,该类继承TypeConverter,并需要重写一个该类的一个成员函数ConvertFrom,并且为需要进行转换的类添加一个类型转换的属性,最后在XAML中进行静态资源的使用就可以了!
相应类的示例代码如下所示:
Human.cs
[TypeConverterAttribute(typeof(ChildConverterToHuman))] public class Human { public string Name { get; set; } public Human Child { get; set; } } public class ChildConverterToHuman : TypeConverter { public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { Human h = new Human(); string str = value.ToString(); h.Name = str; return h; } }
MainWindow.xaml
<Window.Resources> <local:Human x:Key="human" Name="hippie" child="tom"/> </Window.Resources>
这样我们就可以正确转化Human对象的child的属性的数据类型;
Human hu = this.FindResource("human") as Human; if (hu != null) { MessageBox.Show(hu.Name + hu.Child.Name); }
方法二:道理和方法一是一样,依然需要定义一个类型转换的类,但是需要继承的类是IValueConverter类,需要我们重写Convert和ConvertBack函数(一般重写Convert就可以)
public class Person { public string Name { get; set; } public bool Gender { get; set; } } public class Converter : IValueConverter { /// <summary> /// Model TO UI /// </summary> /// <param name="value"></param> /// <param name="targetType"></param> /// <param name="parameter"></param> /// <param name="culture"></param> /// <returns></returns> public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { bool gender = (bool)value; if (gender == true) { return "男"; } else { return "女"; } } /// <summary> /// UI TO Model /// </summary> /// <param name="value"></param> /// <param name="targetType"></param> /// <param name="parameter"></param> /// <param name="culture"></param> /// <returns></returns> public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }
<Window.Resources> <local:Converter x:Key="converter"/> </Window.Resources> <Grid> <StackPanel> <StackPanel x:Name="sp" Orientation="Horizontal"> <TextBlock Text="{Binding Name}" FontSize="20" Margin="0,0,24,0"/> <TextBlock Text="{Binding Gender, Converter={StaticResource converter}}" FontSize="20"/> </StackPanel> </StackPanel> </Grid>
Person p = new Person { Name = "Tom", Gender = false }; sp.DataContext = p;
这样我们就可以将不同的数据类型通过一定的转化显示在程序界面上了!