1、Converter介绍

在WPF应用程序中经常遇到类似这样的问题,在定义的类中用的bool类型的值,但是界面上某个控件的显示属性是Visibility的枚举类型的,解决这个问题可以简单在定义的类中加入一个Visibility类型的属性,将其与界面上控件的Visibility进行绑定,就可以在代码中直接操控控件的显隐了。但是采用这种方式,无可避免的让你多写了许多代码,并且功能上有重复。

幸运的是WPF已经提供了一个Convert方法,可以允许我们自定义一个Converter类,让界面的属性直接绑定你定义的类型,中间做一个类型的转换就可以实现bool到Visibility的绑定。

需求中经常有这样的问题,我输入的是一种数据类型,但是我在界面显示的完全不同的东西。这样就需要转换。WPF、Silverlight及Windows Phone程序开发中往往需要将绑定的数据进行特定转换,比如DateTime类型的时间转换为yyyyMMdd的日期,再如有一个值是根据另外多组值的不同而异的,此时我们就需要定制自己的Converter。

.Net Framework提供了两种Converter接口,单值转换的接口IValueConverter和多值转换的接口IMultiValueConverter,它们都属于System.Windows.Data命名空间,在程序集PresentationFramework.dll中。这两种值转换器都是分区域性的。其中方法Convert和ConvertBack都具有指示区域性信息的culture参数。如果区域性信息与转换无关,那么在自定义转换器中可以忽略该参数。

2、一个简单的Converter

下面的例子为bool值转换为Visibility的Converter

  1. using System;
  2. using System.Globalization;
  3. using System.Windows;
  4. using System.Windows.Data;
  5. namespace Common
  6. {
  7. /// <summary>
  8. /// 布尔值转换为可见性
  9. /// </summary>
  10. public class BooleanToVisibilityConverter : IValueConverter
  11. {
  12. ///当界面的绑定到DataContext中的属性发生变化时,会调用该方法,将绑定的bool值转换为界面需要的Visibility类型的值
  13. public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  14. {
  15. return (bool)value ? Visibility.Visible : Visibility.Collapsed;
  16. }
  17. ///当界面的Visibility值发生变化时,会调用该方法,将Visibility类型的值转换为bool值返回给绑定到DataContext中的属性
  18. public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  19. {
  20. Visibility v=value as Visibility;
  21. if(v==null)
  22. {
  23. return false;
  24. }
  25. if(v==Visibility.Visible){
  26. return true;
  27. }
  28. else
  29. return false;
  30. }
  31. }
  32. }

在Xaml中使用Converter

1、引用Converter

  1. <UserControl x:Class="View.GNSSProjectView"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:converter="clr-namespace:Converter"
  7. >
  8. <UserControl.Resources>
  9. <converter:DoubleConvertToString x:Key="DoubleConvertToString"/>
  10. </UserControl.Resources>
  11. <Grid>
  12. <StackPanel Visibility="{Binding IsVisible,Converter={StaticResource BooleanToVisibilityConverter}}"
  13. Orientation="Horizontal" >
  14. <TextBox MaxLength="13">
  15. <Binding NotifyOnValidationError="True">
  16. <Binding.ValidationRules>
  17. <controls:DoubleValidationRule ValidatesOnTargetUpdated="True" />
  18. </Binding.ValidationRules>
  19. </Binding>
  20. </TextBox>
  21. </StackPanel>
  22. </Grid>
  23. </UserControl>

2、在需要使用的控件中使用Converter

  1. <StackPanel Visibility="{Binding IsVisible,Converter={StaticResource BooleanToVisibilityConverter}}"
  2. Orientation="Horizontal" >
  3. <TextBox MaxLength="13">
  4. <Binding NotifyOnValidationError="True">
  5. <Binding.ValidationRules>
  6. <controls:DoubleValidationRule ValidatesOnTargetUpdated="True" />
  7. </Binding.ValidationRules>
  8. </Binding>
  9. </TextBox>
  10. </StackPanel>

3、单值转换IValueConverter

单值转换Converter详情可参考2、一个简单的Converter,这边再附上一个例子BytesToStringConverter,这是将byte数组与string互相转换的Converter

  1. using Google.Protobuf;
  2. using StoryEditor.Utlis;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Windows.Data;
  9. namespace Control
  10. {
  11. public class BytesToStringConverter : IValueConverter
  12. {
  13. public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  14. {
  15. if (!(value is byte[]))
  16. {
  17. return null;
  18. }
  19. byte[] bytes = value as byte[];
  20. string str = System.Text.Encoding.Default.GetString(bytes);
  21. return str.ToString();
  22. }
  23. public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  24. {
  25. if (!(value is string))
  26. {
  27. return null;
  28. }
  29. byte[] bytes = System.Text.Encoding.Default.GetBytes(value as string);
  30. return bytes;
  31. }
  32. }
  33. }

在Xaml中使用Converter

  1. <UserControl x:Class="View.EventView.SpeechShowEventView"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  5. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  6. xmlns:local="clr-namespace:StoryEditor.View.EventView"
  7. xmlns:control="clr-namespace:Control"
  8. xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
  9. mc:Ignorable="d"
  10. d:DesignHeight="350" d:DesignWidth="1000">
  11. <UserControl.Resources>
  12. <control:BytesToStringConverter x:Key="BytesToStringConverter"/>
  13. </UserControl.Resources>
  14. <Grid>
  15. <TextBox TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Visible"
  16. FontSize="14" Margin="5,10"
  17. Text="{Binding Content,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,
  18. Converter={StaticResource BytesToStringConverter}}" />
  19. </Grid>
  20. </UserControl>

4、多值转换IMultiValueConverter

1、Converter的代码

  1. using System;
  2. using System.Globalization;
  3. using System.Windows.Data;
  4. namespace Converter
  5. {
  6. public class CanExportConvert : IMultiValueConverter
  7. {
  8. public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
  9. {
  10. string str1 = values[0].ToString();
  11. string str2 = values[1].ToString();
  12. bool? flag = (bool?)values[2];
  13. if (flag == false && string.IsNullOrEmpty(str1))
  14. {
  15. return false;
  16. }
  17. else if (flag == true && string.IsNullOrEmpty(str2))
  18. {
  19. return false;
  20. }
  21. return true;
  22. }
  23. public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
  24. {
  25. throw new NotImplementedException();
  26. }
  27. }
  28. }

2、xaml中使用converter

  1. <UserControl x:Class="View.DJIPosExportSettingView"
  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. xmlns:local="clr-namespace:CHC.CGO.UAV.View"
  7. xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
  8. xmlns:cvt="clr-namespace:Converter"
  9. mc:Ignorable="d"
  10. ResizeMode="NoResize" WindowStartupLocation="CenterOwner" Header="{DynamicResource UAV_ExpoetSetting}"
  11. Style="{StaticResource RadWindowStyle}"
  12. MinHeight="230" MinWidth="600">
  13. <UserControl.Resources>
  14. <cvt:CanExportConvert x:Key="CanExportConvert"/>
  15. </UserControl.Resources>
  16. <Grid Margin="5">
  17. <Button Name="exportButton"
  18. Content="{DynamicResource UAV_Export}"
  19. Margin="20,0,15,0"
  20. Height="20" Width="65"
  21. HorizontalAlignment="Right"
  22. VerticalAlignment="Center">
  23. <Button.IsEnabled>
  24. <MultiBinding Converter="{StaticResource CanExportConvert}">
  25. <Binding Path="Text" ElementName="photoPath"/>
  26. <Binding Path="Text" ElementName="startPhotoNumber"/>
  27. <Binding Path="IsChecked" ElementName="checkNotMatching"/>
  28. </MultiBinding>
  29. </Button.IsEnabled>
  30. </Button>
  31. </Grid>
  32. </UserControl>

原理与单值转换IValueConverter是一样的,注意xaml中绑定的写法即可

WPF之Converter的更多相关文章

  1. [WPF 容易忽视的细节] —— Exception in WPF's Converter

    前言: 在WPF中,Converter是我们经常要用到的一个工具,因为XAML上绑定的数据不一定是我们需要的数据. 问题: 在Converter中抛出一个异常导致程序崩溃,而且是在对未捕获异常进行集中 ...

  2. WPF 之Converter

    WPF  之Converter Leo 在我们做项目的时候,经常会遇见这样的事情: 在数据中我们定义的是true,false 而在现实的时候则可能要求男,女 我们还得能定义成了0,1,2,3,4,5, ...

  3. WPF中Converter的使用

    WPF中Converter的用于对数据的转换.以下实例将实现将数据中的性别属性的转换(0:男,1:女). 1.创建SexConverter.cs类,并实现IValueConverter接口 publi ...

  4. 年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)

    WPF中Style的使用 Styel在英文中解释为”样式“,在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外观更加美化同时减少了 ...

  5. WPF converter

    单值转换器 将单一值转换为特定类型的值,以日期转换为例如下: 1.定制DateConverter类,其中当值从绑定源传播给绑定目标时,调用方法Convert. 1 public class DateC ...

  6. Silverlight或WPF动态绑定图片路径问题,不用Converter完美解决

    关于Silverlight或WPF动态绑定图片路径问题,不用Converter完美解决, 可想,一个固定的字符串MS都能找到,按常理动态绑定也应该没问题的,只需在前面标记它是一个Path类型的值它就能 ...

  7. WPF Converter 使用复杂参数的方法

    Step 1在WPF的C#代码文件中给定义复杂类型的变量,并给其赋值:Sample code: List<User>lsUser=....Setp 2在 C#代码对应的XAML 中将此复杂 ...

  8. WPF converter(包含传递复杂参数)

    单值转换器 将单一值转换为特定类型的值,以日期转换为例如下: 1.定制DateConverter类,其中当值从绑定源传播给绑定目标时,调用方法Convert. 1 public class DateC ...

  9. 【WPF】wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例

    原文:[WPF]wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例       用Binding并通过Converter转换的时候,可能偶尔会遇到传参的问题, ...

随机推荐

  1. Java StringTokenizer 类使用方法,字符串分割

    Java StringTokenizer 属于 java.util 包,用于分隔字符串. StringTokenizer 构造方法: StringTokenizer(String str) :构造一个 ...

  2. hql 转 sql

    import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.hql.ast.QueryTranslatorI ...

  3. min_25筛入门

    目录 1.什么是min_25筛 2.前置知识 2.1.数论函数 2.2.埃拉托色尼筛 2.3.欧拉筛 3.min_25筛 3.1.计算质数贡献 3.2.计算总贡献 3.3.实现 4.例题 4.1.[L ...

  4. Fibonacci(模板)【矩阵快速幂】

    Fibonacci 题目链接(点击) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20989   Accepted: 14 ...

  5. Node.js环境安装

    为其他使用先小小的接触这个环境,如不出意外,未来的一些时候抽时间会系统的学习element-ui, JavaScript, vue, node.js, 稍后也做个简易的ACE Editor体验一下 1 ...

  6. .Net微服务实战之DevOps篇

    技术只是基础 该系列的两篇文章<.Net微服务实战之技术选型篇>和<.Net微服务实战之技术架构分层篇>都是以技术角度出发描述微服务架构的实施. 如果技术选型篇叙述的是工具,那 ...

  7. cb26a_c++_STL_算法_元素计数

    cb26a_c++_STL_算法_元素计数所有容器都可以使用countcount_if关联容器的等效成员函数,容器自己的成员函数速度较快1.set.count2.multiset.count3.map ...

  8. vc6.0的项目如何在整个项目中查询内容呢?试试vs2015

    vc6.0的项目如何在整个项目中查询内容呢?试试vs2015 https://blog.csdn.net/txwtech/article/details/101308795

  9. 8.实战交付一套dubbo微服务到k8s集群(1)之Zookeeper部署

    1.基础架构 主机名 角色 ip HDSS7-11.host.com K8S代理节点1,zk1 10.4.7.11 HDSS7-12.host.com K8S代理节点2,zk2 10.4.7.12 H ...

  10. 宝塔面板成功部署Django项目流程

    宝塔面板部署Django项目完整流程 上线Django项目记录,超简单,避免无意义的踩坑! 第一步:安装python管理器 在宝塔在线面板安装“python项目管理器” 第二步:安装适配python版 ...