WPF中在XAML中实现数据类型转换的两种方法

熟悉数据绑定的朋友都知道,当我们在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;

这样我们就可以将不同的数据类型通过一定的转化显示在程序界面上了!

时间: 2024-08-06 11:55:05

WPF中在XAML中实现数据类型转换的两种方法的相关文章

oracle rename数据文件的两种方法

oracle rename数据文件的两种方法 2012-12-11 20:44 10925人阅读 评论(0) 收藏 举报  分类: oracle(98)  版权声明:本文为博主原创文章,未经博主允许不得转载. 第一种 alter tablespace users rename datafile '==' to '***'; 这种方式需要数据库处于open状态,表空间在offline的状态下才能更改. [sql] view plain copy SQL> alter tablespace user

SpringMVC数据类型转换的两种方式

1. 自定义类型转换器实现Converter<S,T>接口并加入到SpringMVC的IOC容器中 2.配置自定义转换器到FormattingConversionServiceFactoryBean工厂中! 注意ID好像只能为conversionService 这样通过请求到达目标Handler之前对请求参数进行字符串修改,将Handler入参格式的数据返回,实现转换器的作用 2.相同的原理,用filter拦截请求 自定义filter实现Filter接口:在web.xml里注册filter:用

shell中调用R语言并传入参数的两种方法

第一种: Rscript myscript.R R脚本的输出 第二种: R CMD BATCH myscript.R # Check the output cat myscript.Rout 调用R脚本的全部控制台log 传入参数: 在脚本中add args<-commandArgs(TRUE) 然后shell中: Rscript myscript.R arg1 arg2 arg3 注意取出来的参数是所有参数连在一起的character

SQL2008全部数据导出导入两种方法

方法一:生成脚本导出导入sql2008全部数据 第一步,右键要导出的数据库,任务--生成脚本 第二步,在设置脚本编写选项处,点击--高级(A),选择要编写脚本的数据的类型为:架构和数据 如果找不到 要编写脚本的数据的类型 ,可以看下图,sql2008(有多个版本),把编写数据的脚本设置为TRUE即可 第三步:选择要保存的地方,一直下一步就可以了 第四步:在要导入的数据库中新建查询:从SET ANSI_NULLS ON 处开始执行(可以删除这句前面所有语句) 上面方法,用到本人的sql serve

SQL2008所有数据导出导入两种方法

方法一:生成脚本导出导入sql2008所有数据 第一步.右键要导出的数据库.任务--生成脚本 第二步,在设置脚本编写选项处,点击--高级(A),选择要编写脚本的数据的类型为:架构和数据 假设找不到 要编写脚本的数据的类型 .能够看下图.sql2008(有多个版本号),把编写数据的脚本设置为TRUE就可以 第三步:选择要保存的地方,一直下一步就能够了 第四步:在要导入的数据库中新建查询:从SET ANSI_NULLS ON 处開始运行(能够删除这句前面全部语句) 上面方法,用到本人的sql ser

vue在使用ajax获取数据时,两种方法(jquery和vue_resource)

@{    Layout = null;} <!DOCTYPE html> <html><head>    <meta name="viewport" content="width=device-width" />    <title>Index</title>    <script src="~/Scripts/jquery-1.8.2.min.js"><

MySQL中删除数据的两种方法

转自:http://blog.csdn.net/apache6/article/details/2778878 在MySQL中有两种方法可以删除数据,一种是DELETE语句,另一种是TRUNCATE TABLE语句. DELETE语句可以通过WHERE对要删除的记录进行选择.而使用TRUNCATE TABLE将删除表中的所有记录.因此,DELETE语句更灵活. 如果要清空表中的所有记录,可以使用下面的两种方法: DELETE FROM table1 TRUNCATE TABLE table1 其

Android数据存储的五种方法汇总

本文介绍Android中的5种数据存储方式. 数据存储在开发中是使用最频繁的,在这里主要介绍Android平台中实现数据存储的5种方式,分别是: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面将为大家一一详细介绍. 第一种: 使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置

IOS开发中数据持久化的几种方法--NSUserDefaults

IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefault是最简单直接的一个办法: 1)保存数据: 1 // 实例化一个NSUserDefaults单例对象 2 NSUserDefaults *user = [NSUserDefaults standardUserDefaults]; 3 // 把一个数组array保存在key为allContact的键值