WPF之Converter
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
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace Common
{
/// <summary>
/// 布尔值转换为可见性
/// </summary>
public class BooleanToVisibilityConverter : IValueConverter
{
///当界面的绑定到DataContext中的属性发生变化时,会调用该方法,将绑定的bool值转换为界面需要的Visibility类型的值
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
///当界面的Visibility值发生变化时,会调用该方法,将Visibility类型的值转换为bool值返回给绑定到DataContext中的属性
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
Visibility v=value as Visibility;
if(v==null)
{
return false;
}
if(v==Visibility.Visible){
return true;
}
else
return false;
}
}
}
在Xaml中使用Converter
1、引用Converter
<UserControl x:Class="View.GNSSProjectView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:converter="clr-namespace:Converter"
>
<UserControl.Resources>
<converter:DoubleConvertToString x:Key="DoubleConvertToString"/>
</UserControl.Resources>
<Grid>
<StackPanel Visibility="{Binding IsVisible,Converter={StaticResource BooleanToVisibilityConverter}}"
Orientation="Horizontal" >
<TextBox MaxLength="13">
<Binding NotifyOnValidationError="True">
<Binding.ValidationRules>
<controls:DoubleValidationRule ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</TextBox>
</StackPanel>
</Grid>
</UserControl>
2、在需要使用的控件中使用Converter
<StackPanel Visibility="{Binding IsVisible,Converter={StaticResource BooleanToVisibilityConverter}}"
Orientation="Horizontal" >
<TextBox MaxLength="13">
<Binding NotifyOnValidationError="True">
<Binding.ValidationRules>
<controls:DoubleValidationRule ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</TextBox>
</StackPanel>
3、单值转换IValueConverter
单值转换Converter详情可参考2、一个简单的Converter,这边再附上一个例子BytesToStringConverter,这是将byte数组与string互相转换的Converter
using Google.Protobuf;
using StoryEditor.Utlis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace Control
{
public class BytesToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (!(value is byte[]))
{
return null;
}
byte[] bytes = value as byte[];
string str = System.Text.Encoding.Default.GetString(bytes);
return str.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (!(value is string))
{
return null;
}
byte[] bytes = System.Text.Encoding.Default.GetBytes(value as string);
return bytes;
}
}
}
在Xaml中使用Converter
<UserControl x:Class="View.EventView.SpeechShowEventView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:StoryEditor.View.EventView"
xmlns:control="clr-namespace:Control"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
mc:Ignorable="d"
d:DesignHeight="350" d:DesignWidth="1000">
<UserControl.Resources>
<control:BytesToStringConverter x:Key="BytesToStringConverter"/>
</UserControl.Resources>
<Grid>
<TextBox TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Visible"
FontSize="14" Margin="5,10"
Text="{Binding Content,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,
Converter={StaticResource BytesToStringConverter}}" />
</Grid>
</UserControl>
4、多值转换IMultiValueConverter
1、Converter的代码
using System;
using System.Globalization;
using System.Windows.Data;
namespace Converter
{
public class CanExportConvert : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string str1 = values[0].ToString();
string str2 = values[1].ToString();
bool? flag = (bool?)values[2];
if (flag == false && string.IsNullOrEmpty(str1))
{
return false;
}
else if (flag == true && string.IsNullOrEmpty(str2))
{
return false;
}
return true;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
2、xaml中使用converter
<UserControl x:Class="View.DJIPosExportSettingView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CHC.CGO.UAV.View"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:cvt="clr-namespace:Converter"
mc:Ignorable="d"
ResizeMode="NoResize" WindowStartupLocation="CenterOwner" Header="{DynamicResource UAV_ExpoetSetting}"
Style="{StaticResource RadWindowStyle}"
MinHeight="230" MinWidth="600">
<UserControl.Resources>
<cvt:CanExportConvert x:Key="CanExportConvert"/>
</UserControl.Resources>
<Grid Margin="5">
<Button Name="exportButton"
Content="{DynamicResource UAV_Export}"
Margin="20,0,15,0"
Height="20" Width="65"
HorizontalAlignment="Right"
VerticalAlignment="Center">
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource CanExportConvert}">
<Binding Path="Text" ElementName="photoPath"/>
<Binding Path="Text" ElementName="startPhotoNumber"/>
<Binding Path="IsChecked" ElementName="checkNotMatching"/>
</MultiBinding>
</Button.IsEnabled>
</Button>
</Grid>
</UserControl>
原理与单值转换IValueConverter是一样的,注意xaml中绑定的写法即可
WPF之Converter的更多相关文章
- [WPF 容易忽视的细节] —— Exception in WPF's Converter
前言: 在WPF中,Converter是我们经常要用到的一个工具,因为XAML上绑定的数据不一定是我们需要的数据. 问题: 在Converter中抛出一个异常导致程序崩溃,而且是在对未捕获异常进行集中 ...
- WPF 之Converter
WPF 之Converter Leo 在我们做项目的时候,经常会遇见这样的事情: 在数据中我们定义的是true,false 而在现实的时候则可能要求男,女 我们还得能定义成了0,1,2,3,4,5, ...
- WPF中Converter的使用
WPF中Converter的用于对数据的转换.以下实例将实现将数据中的性别属性的转换(0:男,1:女). 1.创建SexConverter.cs类,并实现IValueConverter接口 publi ...
- 年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)
WPF中Style的使用 Styel在英文中解释为”样式“,在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外观更加美化同时减少了 ...
- WPF converter
单值转换器 将单一值转换为特定类型的值,以日期转换为例如下: 1.定制DateConverter类,其中当值从绑定源传播给绑定目标时,调用方法Convert. 1 public class DateC ...
- Silverlight或WPF动态绑定图片路径问题,不用Converter完美解决
关于Silverlight或WPF动态绑定图片路径问题,不用Converter完美解决, 可想,一个固定的字符串MS都能找到,按常理动态绑定也应该没问题的,只需在前面标记它是一个Path类型的值它就能 ...
- WPF Converter 使用复杂参数的方法
Step 1在WPF的C#代码文件中给定义复杂类型的变量,并给其赋值:Sample code: List<User>lsUser=....Setp 2在 C#代码对应的XAML 中将此复杂 ...
- WPF converter(包含传递复杂参数)
单值转换器 将单一值转换为特定类型的值,以日期转换为例如下: 1.定制DateConverter类,其中当值从绑定源传播给绑定目标时,调用方法Convert. 1 public class DateC ...
- 【WPF】wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例
原文:[WPF]wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例 用Binding并通过Converter转换的时候,可能偶尔会遇到传参的问题, ...
随机推荐
- 171.Excel列表序号
2020-03-17 Excel表列序号 A -> 1. B -> 2 Z -> 26 AA -> 27 ZY -> 701 示例: 输入: s = "LEET ...
- Flutter 中由 BuildContext 引发的血案
今天和各位分享一个博主在实际开发中遇到的问题,以及解决方法.废话不多说,我们先来看需求: 我们要做一个iOS风格的底部菜单弹出组件,具体涉及showCupertinoModalPopup()方法,该方 ...
- Mybatis源码手记-从缓存体系看责任链派发模式与循环依赖企业级实践
一.缓存总览 Mybatis在设计上处处都有用到的缓存,而且Mybatis的缓存体系设计上遵循单一职责.开闭原则.高度解耦.及其精巧,充分的将缓存分层,其独到之处可以套用到很多类似的业务上.这里将主要 ...
- [经验栈]C#监测IPv4v6网速及流量
1.前言 最近做项目需要用到监测网速及流量,我经过百度和墙内谷歌都没能快速发现监测IPV6流量和网速的用例:也经过自己的一番查询和调试,浪费了不少时间,现在作为经验分享出来希望大家指正. 2.C# ...
- k8s的两种网络方案与多种工作模式[flannel与calico]
k8s的两种网络方案与多种工作模式 1. Flannel: flannel有三种工作模式: 1. vxlan(隧道方案) 2. host-gw(路由方案) 2. udp(在用户态实现的数据封装解封装, ...
- HTTP参数污染学习
HTTP参数污染 --- HPP 参考: 参数污染漏洞(HPP)挖掘技巧及实战案例全汇总 视频内容 HPP,简而言之,就是给参数赋上多个值. 比如: https://www.baidu.com/s?w ...
- 前端笔记:div只显示两行内容,多出内容以...显示
代码: text-overflow: -o-ellipsis-lastline;overflow: hidden;text-overflow: ellipsis;display: -webkit-bo ...
- 尚学堂 216 java中的字节码操作
所谓的字节码操作就是操作我们已经加载的字节码 接下来我们重点来讲解javaassist类库 使用需要下载jar包,把jar包添加到对应的工程之后 package com.bjsxt.test; pub ...
- web如何测试
当我们负责web测试的时候,先了解B/S架构,然后分析如何开始执行测试,一般步骤:从功能测试,兼容测试,安全测试. 功能测试: 一.链接测试,链接是web应用系统的一个很重要的特征,主要是用于页面之间 ...
- bugku 一个神奇的登录框
一个登录界面,填个admin,123试试,提示try again 抓包看看. 在admin后加个’提示try again 看来是被过滤了,试试” 报错了,加上# 报错没有了,说明存在注入点. 先来判断 ...