Binding数据转换Convert、StringFormat

Convert

如果要将值转换器与绑定相关联,请创建一个实现IValueConverter 接口的类, 然后实现 Convert 和 ConvertBack 方法。

转换器可将数据从一种类型更改为另一种类型,根据区域性信息转换数据,或修改演示的其他方面。

显示数据绑定 Default 属性的图。

 

  • 数据应根据区域性以不同方式显示。 例如,可能需要根据在特定区域性中使用的约定,实现货币转换器或日历日期/时间转换器。

  • 使用的数据不一定会更改属性的文本值,但会更改其他某个值(如图像的源,或显示文本的颜色或样式)。 在这种情况下,可以通过转换可能不合适的属性绑定(如将文本字段绑定到表单元格的 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”往返过程结果:可以往返至相同数字的字符串。

受以下类型支持:SingleDouble 和 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;
        }
    }
}

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值