Convert
如果要将值转换器与绑定相关联,请创建一个实现IValueConverter 接口的类, 然后实现 Convert 和 ConvertBack 方法。
转换器可将数据从一种类型更改为另一种类型,根据区域性信息转换数据,或修改演示的其他方面。
-
数据应根据区域性以不同方式显示。 例如,可能需要根据在特定区域性中使用的约定,实现货币转换器或日历日期/时间转换器。
-
使用的数据不一定会更改属性的文本值,但会更改其他某个值(如图像的源,或显示文本的颜色或样式)。 在这种情况下,可以通过转换可能不合适的属性绑定(如将文本字段绑定到表单元格的 Background 属性)来使用转换器。
-
多个控件或控件的多个属性会绑定到相同数据。 在这种情况下,主绑定可能仅显示文本,而其他绑定则处理特定的显示问题,但仍使用同一绑定作为源信息。
-
目标属性具有绑定集合,称为 MultiBinding。 对于 MultiBinding,使用自定义 IMultiValueConverter 从绑定的值中生成最终值。 例如,可以从红色、蓝色和绿色的值来计算颜色,这些值可能来自相同绑定源对象,也可能来自不同绑定源对象。 有关示例和信息,请参阅 MultiBinding。
IValueConverter
提供将自定义逻辑应用于绑定的方法。
数据绑定引擎在将值从绑定源传播到绑定目标时会调用此方法。
public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture);
数据绑定引擎在将值从绑定目标传播到绑定源时调用此方法。
public object ConvertBack (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture);
IMultiValueConverter
提供在 MultiBinding 中应用自定义逻辑的方法。
将源值转换为绑定目标的值。 数据绑定引擎在将该值从源绑定传播到绑定目标时会调用此方法。
public object Convert (object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture);
将绑定目标值转换为源绑定值。
public object[] ConvertBack (object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture);
范例
IValueConverter范例
TextBox①输入:0~9,TextBox②③④⑤会相应转化为:零~九
TextBox②输入:零~九,TextBox①会相应转化为:0~9
<Window x:Class="ConvertDemo.MainWindow"
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:ConvertDemo"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<local:myTextConverter x:Key="myconverter"/>
</Window.Resources>
<StackPanel>
<!--第1个TextBox-->
<TextBox Margin="5" x:Name="tbx1" Text="1"/>
<!--第2个TextBox-->
<TextBox Margin="5" Text="{Binding Path=Text,ElementName=tbx1,Converter={ StaticResource myconverter}}" />
<!--第3个TextBox-->
<TextBox Margin="5">
<TextBox.Text>
<Binding >
<Binding.Converter>
<local:myTextConverter />
</Binding.Converter>
<Binding.Path>
Text
</Binding.Path>
<Binding.ElementName>
tbx1
</Binding.ElementName>
</Binding>
</TextBox.Text>
</TextBox>
<!--第4个TextBox-->
<TextBox Margin="5">
<TextBox.Text>
<Binding Path="Text" ElementName="tbx1" >
<Binding.Converter>
<local:myTextConverter />
</Binding.Converter>
</Binding>
</TextBox.Text>
</TextBox>
<!--第5个TextBox-->
<TextBox Margin="5" x:Name="tbx2"/>
</StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ConvertDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//第5个Textbox
Binding binding = new Binding("Text") { ElementName = "tbx1" };
binding.Converter = new myTextConverter();
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
foreach (var item in (this.Content as StackPanel).Children)
{
if (item is TextBox)
if ((item as TextBox).Name == "tbx2")
(item as TextBox).SetBinding(TextBox.TextProperty,binding);
}
}
}
public class myTextConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//string s = String.Empty;
int result;
if (Int32.TryParse(value.ToString(), out result) && value.ToString().Length == 1)
{
switch (result)
{
case 0: return "零";
case 1: return "一";
case 2: return "二";
case 3: return "三";
case 4: return "四";
case 5: return "五";
case 6: return "六";
case 7: return "七";
case 8: return "八";
case 9: return "九";
}
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value.ToString().Length == 1)
{
switch (value.ToString())
{
case "零": return 0;
case "一": return 1;
case "二": return 2;
case "三": return 3;
case "四": return 4;
case "五": return 5;
case "六": return 6;
case "七": return 7;
case "八": return 8;
case "九": return 9;
}
}
return null;
}
}
}
StringFormat
BindingBase.StringFormat
获取或设置一个字符串,该字符串指定如果绑定值显示为字符串,应如何设置该绑定的格式。
public string StringFormat { get; set; }
如果设置了 Converter 和 StringFormat 属性,则转换器将首先应用于数据值,然后 StringFormat 应用。
使用MultiBinding 时, 仅当在MultiBinding 上设置StringFormat 属性时,该属性才适用 。在任何子Binding对象上设置的StringFormat的值都将被忽略。复合字符串格式的参数数量不能超过MultiBinding中的子Binding对象的数量。
标准数字格式字符串
格式说明符 | “属性” | 描述 | 示例 |
---|---|---|---|
“C”或“c” | 货币 | 结果:货币值。 受以下类型支持:所有数值类型。 精度说明符:十进制小数位数。 默认值精度说明符:由 NumberFormatInfo.CurrencyDecimalDigits 定义。 更多信息:货币(“C”)格式说明符。 | 123.456 ("C", en-US) -> $123.46 123.456 ("C", fr-FR) -> 123,46 € 123.456 ("C", ja-JP) -> ¥123 -123.456 ("C3", en-US) -> ($123.456) -123.456 ("C3", fr-FR) -> -123,456 € -123.456 ("C3", ja-JP) -> -¥123.456 |
“D”或“d” | 十进制 | 结果:整型数字,负号可选。 受以下类型支持:仅限整型类型。 精度说明符:数字位数下限。 默认值精度说明符:所需数字位数下限。 更多信息:十进制(“D”)格式说明符。 | 1234 ("D") -> 1234 -1234 ("D6") -> -001234 |
“E”或“e” | 指数(科学型) | 结果:指数表示法。 受以下类型支持:所有数值类型。 精度说明符:十进制小数位数。 默认值精度说明符:6. 更多信息:指数(“E”)格式说明符。 | 1052.0329112756 ("E", en-US) -> 1.052033E+003 1052.0329112756 ("e", fr-FR) -> 1,052033e+003 -1052.0329112756 ("e2", en-US) -> -1.05e+003 -1052.0329112756 ("E2", fr-FR) -> -1,05E+003 |
“F”或“f” | 定点 | 结果:整数和十进制小数,负号可选。 受以下类型支持:所有数值类型。 精度说明符:十进制小数位数。 默认值精度说明符:由 NumberFormatInfo.NumberDecimalDigits 定义。 更多信息:定点(“F”)格式说明符。 | 1234.567 ("F", en-US) -> 1234.57 1234.567 ("F", de-DE) -> 1234,57 1234 ("F1", en-US) -> 1234.0 1234 ("F1", de-DE) -> 1234,0 -1234.56 ("F4", en-US) -> -1234.5600 -1234.56 ("F4", de-DE) -> -1234,5600 |
“G”或“g” | 常规 | 结果:更紧凑的定点表示法或科学记数法。 受以下类型支持:所有数值类型。 精度说明符:有效位数。 默认值精度说明符:具体取决于数值类型。 更多信息:常规(“G”)格式说明符。 | -123.456 ("G", en-US) -> -123.456 -123.456 ("G", sv-SE) -> -123,456 123.4546 ("G4", en-US) -> 123.5 123.4546 ("G4", sv-SE) -> 123,5 -1.234567890e-25 ("G", en-US) -> -1.23456789E-25 -1.234567890e-25 ("G", sv-SE) -> -1,23456789E-25 |
“N”或“n” | 数字 | 结果:整数和十进制小数、组分隔符和十进制小数分隔符,负号可选。 受以下类型支持:所有数值类型。 精度说明符:所需的小数位数。 默认值精度说明符:由 NumberFormatInfo.NumberDecimalDigits 定义。 更多信息:数字(“N”)格式说明符。 | 1234.567 ("N", en-US) -> 1,234.57 1234.567 ("N", ru-RU) -> 1 234,57 1234 ("N1", en-US) -> 1,234.0 1234 ("N1", ru-RU) -> 1 234,0 -1234.56 ("N3", en-US) -> -1,234.560 -1234.56 ("N3", ru-RU) -> -1 234,560 |
“P”或“p” | 百分比 | 结果:数字乘以 100 并以百分比符号显示。 受以下类型支持:所有数值类型。 精度说明符:所需的小数位数。 默认值精度说明符:由 NumberFormatInfo.PercentDecimalDigits 定义。 更多信息:百分比(“P”)格式说明符。 | 1 ("P", en-US) -> 100.00 % 1 ("P", fr-FR) -> 100,00 % -0.39678 ("P1", en-US) -> -39.7 % -0.39678 ("P1", fr-FR) -> -39,7 % |
“R”或“r” | 往返过程 | 结果:可以往返至相同数字的字符串。 受以下类型支持:Single、Double 和 BigInteger。 注意:建议只用于 BigInteger 类型。 对于 Double 类型,请使用 "G17";对于 Single 类型,请使用 "G9"。 精度说明符:已忽略。 更多信息:往返过程(“R”)格式说明符。 | 123456789.12345678 ("R") -> 123456789.12345678 -1234567890.12345678 ("R") -> -1234567890.1234567 |
“X”或“x” | 十六进制 | 结果:十六进制字符串。 受以下类型支持:仅限整型类型。 精度说明符:结果字符串中的位数。 更多信息:十六进制(“X”)格式说明符。 | 255 ("X") -> FF -1 ("x") -> ff 255 ("x4") -> 00ff -1 ("X4") -> 00FF |
范例
<Window x:Class="ConvertDemo.MainWindow"
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:ConvertDemo"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<local:myTextConverter x:Key="myconverter"/>
</Window.Resources>
<StackPanel>
<!--第1个TextBox-->
<TextBox Margin="5" x:Name="tbx1" Text="1"/>
<!--第2个TextBox-->
<TextBox Margin="5" Text="{Binding Path=Text,ElementName=tbx1,Converter={ StaticResource myconverter}, StringFormat={}{0:C2}}" />
<!--第3个TextBox-->
<TextBox Margin="5">
<TextBox.Text>
<Binding StringFormat="{}{0:C3}">
<Binding.Converter>
<local:myTextConverter />
</Binding.Converter>
<Binding.Path>
Text
</Binding.Path>
<Binding.ElementName>
tbx1
</Binding.ElementName>
</Binding>
</TextBox.Text>
</TextBox>
<!--第4个TextBox-->
<TextBox Margin="5">
<TextBox.Text>
<Binding Path="Text" ElementName="tbx1" StringFormat="The result is {0:C4}" >
<Binding.Converter >
<local:myTextConverter />
</Binding.Converter>
</Binding>
</TextBox.Text>
</TextBox>
<!--第5个TextBox-->
<TextBox Margin="5" x:Name="tbx2"/>
</StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ConvertDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//第5个Textbox
Binding binding = new Binding("Text") { ElementName = "tbx1" };
binding.Converter = new myTextConverter();
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
binding.StringFormat ="The TextBox5 is {0:c5}";
foreach (var item in (this.Content as StackPanel).Children)
{
if (item is TextBox)
if ((item as TextBox).Name == "tbx2")
(item as TextBox).SetBinding(TextBox.TextProperty, binding);
}
}
}
public class myTextConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
double result;
if (Double.TryParse(value.ToString(), out result))
{
return result;
}
return 0.0;
}
//未编写功能
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return null;
}
}
}