单值转换器
将单一值转换为特定类型的值,以日期转换为例如下:
1、定制DateConverter类,其中当值从绑定源传播给绑定目标时,调用方法Convert。
1 public class DateConverter : IValueConverter 2 { 3 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 4 { 5 return ((DateTime)value).ToString("yyyy/MM/dd"); 6 } 7 8 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 9 {10 return null;11 }12 }
当值从绑定目标传播给绑定源时,调用此方法ConvertBack,方法ConvertBack的实现必须是方法Convert的反向实现。例如下:
1 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 2 { 3 DateTime date = (DateTime)value; 4 return date.ToShortDateString(); 5 } 6 7 public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 8 { 9 string strValue = value as string;10 DateTime resultDateTime;11 if (DateTime.TryParse(strValue, out resultDateTime))12 {13 return resultDateTime;14 }15 return DependencyProperty.UnsetValue;16 }
返回值DependencyProperty.UnsetValue表示转换器没有生成任何值。但是通常情况下方法ConvertBack没有方法Convert常用,这里不做过多介绍。
2、在xmal文件引用DateConverter类所在命名空间。
1 xmlns:cvt="clr-namespace:ValueConverterDemo.Converter"
3、在xaml文件添加Resources。
1 <Window.Resources>2 <cvt:DateConverter x:Key="cvtDate"/>3 </Window.Resources>
4、在xaml文件中指定Binding值的Converter
1 Text="{Binding CurrentDate, Converter={StaticResource cvtDate}}"
效果如下图,图中“时间”是未经过转换的原始DateTime类型,“日期”经过转换处理后只显示日期部分。
多值转换器
将多组值转换为特定类型的值,以纵横流量影响交通指示灯颜色的变化为例如下:
当纵向流量大于横向流量时指示灯应为绿色,当纵向流量小于横向流量时指示灯应为红色,否则指示灯为黄色。
1、定制ColorConverter类,此时Convert中参数是object[] values,values[0]对应MultiBinding中的第一个Binding值,这里是纵向流量值,依此类推,可以在MultiBinding对象中指定多个绑定。
1 public class ColorConverter : IMultiValueConverter 2 { 3 public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 4 { 5 double verValue = (double)values[0]; 6 double horValue = (double)values[1]; 7 if (verValue > horValue) 8 { 9 return new SolidColorBrush(Colors.Green);10 }11 else if (verValue < horValue)12 {13 return new SolidColorBrush(Colors.Red);14 }15 return new SolidColorBrush(Colors.Yellow);16 }17 18 public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)19 {20 return null;21 }22 }
2、3步同单值转换。
4、xmal文件中指定定制的Converter,此时需要使用的MultiBinding来指定多组Binding。
1 <MultiBinding Converter="{StaticResource cvtColor}">2 <Binding Path="Value" ElementName="slVer"/>3 <Binding Path="Value" ElementName="slHor"/>4 </MultiBinding>
效果如下图交通灯的颜色是根据纵向流量和横向流量的关系而变化的。
- 纵向流量大于横向流量
- 纵向流量小于横向流量
- 纵向流量等于横向流量
WPF Converter 使用复杂参数的方法
Step 1
在WPF的C#代码文件中给定义复杂类型的变量,并给其赋值;
Sample code: List<User>lsUser=。。。。
Setp 2
在 C#代码对应的XAML 中将此复杂参数定义为资源;
Sample code:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:SDKSample"
x:Class="SDKSample.Window1"
Width="400"
Height="280"
Title="MultiBinding Sample">
<Window.Resources>
<c:lsUser x:Key="userList"/>
...
</Window.Resources>
这里的命名空间 C 是你的复杂参数所在的命名空间;
Step 3
<UserControl.Resources>
<app:UserManager x:Key="StaticUsers"/>
<app:UserNameConverter x:Key="UsrConverter"/>
</UserControl.Resources>
<TextBox Text="{Binding XXXX,Converter={StaticResource UsrConverter},
ConverterParameter={StaticResource userList }}" />
Step 4 Converter 里对参数的使用
public class UserNameConverter : IValueConverter
{
public object IValueConverter.Convert(object value, Type targetType,object parameter, CultureInfo culture)
{
List<User> usrs = parameter as List<User>;
...
}
}