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

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

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

  1. 从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接)

    从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接) 一.总结 一句话总结:最好的是这个:"SELECT * FROM table WHERE id >= (( ...

  2. oracle rename数据文件的两种方法

    oracle rename数据文件的两种方法 2012-12-11 20:44 10925人阅读 评论(0) 收藏 举报  分类: oracle(98)  版权声明:本文为博主原创文章,未经博主允许不 ...

  3. Java学习笔记——可视化Swing中JTable控件绑定SQL数据源的两种方法

    在 MyEclipse 的可视化 Swing 中,有 JTable 控件. JTable 用来显示和编辑常规二维单元表. 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方 ...

  4. 怎么在CAD中测量图纸距离?来看看这两种方法

    在CAD中设计图纸最重要的就是图纸的尺寸,俗话说也就是图纸间的距离.通过正确的数据设计出的图纸才能够准确,也能够避免施工时事不必要的误差.那怎么在CAD中测量图纸距离呢?具体要怎么来进行操作呢?下面我 ...

  5. PyQt(Python+Qt)学习随笔:QTableWidget中表格各列平均分配宽度的两种方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在QTableWidget表格部件中,如果需要实现表格中各列要占满部件中的可用空间,同时实现各列平分 ...

  6. 移动oracle数据文件的两种方法

    1.alter database方法该方法,可以移动任何表空间的数据文件. ***关闭数据库***SQL> shutdown immediateDatabase closed.Database ...

  7. SQL2008全部数据导出导入两种方法【转】

        方法一:生成脚本导出导入sql2008全部数据 第一步,右键要导出的数据库,任务--生成脚本 第二步,在设置脚本编写选项处,点击--高级(A),选择要编写脚本的数据的类型为:架构和数据 如果找 ...

  8. Oracle中新建数据表的两种方法

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...

  9. 将网址url中的参数转化为JSON格式的两种方法

    在我们进入主题前,我先先看下获取网址URL的方法: window.location.href // 设置或获取整个URL为字符串 window.location.hash // 设置或获取href属性 ...

随机推荐

  1. 从Kubernetes到“云原生全家桶”,网易如何让业务部署提效280%?

    近日,网易云轻舟微服务团队接受了CNCF的采访,分享了网易云在云原生领域尤其是Kubernetes方面的实践经验.以下为案例全文:公司:网易地点:中国杭州行业:互联网技术 挑战它的游戏业务是世界上最大 ...

  2. Dubbo 源码分析 - 集群容错之 Cluster

    1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上.对于一些负载比较高的服务,会部署更多台服务器.这样,同一环境下的服务提供者数量会大于1.对于服务消费者来说,同一环境下出现了多个服务提供 ...

  3. Javascript高级编程学习笔记(51)—— DOM2和DOM3(3)操作样式表

    操作样式表 在JS中样式表用一种类型来表示,以便我们在JS对其进行操作 这一类型就是CSSStyleSheet 即CSS样式表类型,包括了之前 style 对象所不包括的外部样式表以及嵌入样式表 其中 ...

  4. (转载)Javascript 中的非空判断 undefined,null, NaN的区别

    原文地址:https://blog.csdn.net/oscar999/article/details/9353713 在介绍这三个之间的差别之前, 先来看一下JS  的数据类型. 在 Java ,C ...

  5. [Swift-2019力扣杯春季初赛]1. 易混淆数

    给定一个数字 N,当它满足以下条件的时候返回 true: 把原数字旋转180°以后得到新的数字. 如 0, 1, 6, 8, 9 旋转 180° 以后,得到了新的数字 0, 1, 9, 8, 6 . ...

  6. java IO流之详细总结

    什么是io流? 分为两种: 输入流:可以从文件中读取到程序,从源数据源读取到程序,叫做输入流. 输出流:可以从程序中读取到文件,从程序写,使用输出流,写入到文件中.叫做输出流. 使用File操作文件或 ...

  7. android用OkHttp和okio包通信的坑--气死我了

    今天新建了个项目,想要用用okhttp包来实现Android和tomcat的通信, 于是就根据记忆,把以前可以用的代码复制过来了,然后呢,出现这个.... 图有点大,不知到怎么调小 很莫名其妙,我看了 ...

  8. Plugin with id 'com.novoda.bintray-release' not found.的解决方案

    import Module的时候,有时候会提示Plugin with id 'com.novoda.bintray-release' not found. 点击Open File,定位到该Module ...

  9. CentOS5/6/7系统下搭建安装Amabari大数据集群时出现SSLError: Failed to connect. Please check openssl library versions.错误的解决办法(图文详解)

    不多说,直接上干货! ========================== Creating target directory... ========================== Comman ...

  10. Spring系列之DI的原理及手动实现

    目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 前言 在上一章中,我们介绍和简单实现了容器的部分功能,但是这里还留下了很多的问题.比如我们在构造bean实例的时 ...