动手试验:创建并应用值转换器

此页适用于 WPF 和 Silverlight 2

值转换器是转换数据类型的一种简便方法。在 Microsoft Expression Blend 中,当将对象的属性绑定到数据值或其他属性时,数据类型必须匹配。例如,对于滑块条,可能需要将文本框字符串(如“123”)转换为对应的整数值,或者将字段(如“Visibility.Hidden”)转换为布尔值(如“false”)。

值转换器利用 Microsoft .NET Framework 类中的代码实现“IValueConverter”接口。必须实现“Convert”和“ConvertBack”方法,因为数据绑定引擎在绑定源和绑定目标之间移动值时需要调用这两个方法。有关详细信息,请参阅 MSDN 上的 IValueConverter 接口(此链接可能指向英文页面)。

若要应用值转换器,只需在将数据绑定到属性时完成“创建数据绑定”对话框中的“值转换器”字段。

Cc295312.alert_note(zh-cn,Expression.10).gif说明:

本主题中所介绍的第二个过程使用的是 Silverlight 2 中不支持的元素到元素的绑定来应用值转换器。不过,您可以将值转换器应用于使用 CLR 数据源的数据绑定操作。

创建值转换器类

  • 将以下代码粘贴到名为“DoubleValueConverter.cs”的文件中。此代码包含下列两个值转换器:

    • DoubleToIntegerValueConverter 提供双精度值与整数值之间的双向转换。

    • DoubleToRomanNumeralValueConverter 提供从双精度值到罗马数字的字符串表示形式的单向转换。

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Data;
    
    namespace Microsoft.Expression.Samples
    {
        /// <summary>
        /// DoubleToIntegerValueConverter provides a two-way conversion between
        /// a double value and an integer.
        /// </summary>
        public class DoubleToIntegerValueConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter,
                  System.Globalization.CultureInfo culture)
            {
                return System.Convert.ToInt32(value);
            }
    
            public object ConvertBack(object value, Type targetType,
                object parameter, System.Globalization.CultureInfo culture)
            {
                return System.Convert.ToDouble(value);
            }
    
        }
    
        /// <summary>
        /// DoubleToIntegerValueConverter provides a one-way conversion from
        /// a double value to a string representation of a Roman numeral.
        /// </summary>
        public class DoubleToRomanNumeralValueConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter,
                System.Globalization.CultureInfo culture)
            {
                return this.ConvertToRomanNumeral(System.Convert.ToInt32(value));
            }
    
            public object ConvertBack(object value, Type targetType,
                object parameter, System.Globalization.CultureInfo culture)
            {
                return null;
            }
    
            private List<IntegerStringPair> romanStrings = null;
    
            private string ConvertToRomanNumeral(int input)
            {
                StringBuilder myBuilder = new StringBuilder();
    
                foreach (IntegerStringPair thisPair in this.PairSet)
                {
                    while (input >= thisPair.Value)
                    {
                        myBuilder.Append(thisPair.StringValue);
                        input -= thisPair.Value;
                    }
                }
    
                return myBuilder.ToString();
            }
    
            private List<IntegerStringPair> PairSet
            {
                get
                {
                    if (this.romanStrings == null)
                    {
                        this.romanStrings = new List<IntegerStringPair>();
                        this.romanStrings.Add(new IntegerStringPair(1000, "M"));
                        this.romanStrings.Add(new IntegerStringPair(900, "CM"));
                        this.romanStrings.Add(new IntegerStringPair(500, "D"));
                        this.romanStrings.Add(new IntegerStringPair(400, "CD"));
                        this.romanStrings.Add(new IntegerStringPair(100, "C"));
                        this.romanStrings.Add(new IntegerStringPair(90, "XC"));
                        this.romanStrings.Add(new IntegerStringPair(50, "L"));
                        this.romanStrings.Add(new IntegerStringPair(40, "XL"));
                        this.romanStrings.Add(new IntegerStringPair(10, "X"));
                        this.romanStrings.Add(new IntegerStringPair(9, "IX"));
                        this.romanStrings.Add(new IntegerStringPair(5, "V"));
                        this.romanStrings.Add(new IntegerStringPair(4, "IV"));
                        this.romanStrings.Add(new IntegerStringPair(1, "I"));
                    }
    
                    return this.romanStrings;
                }
            }
        }
    
        /// <summary>
        /// IntegerStringPair provides an easy way to store integer and string pairs.
        /// </summary>
        public class IntegerStringPair
        {
            private int value;
            private string stringValue;
            public int Value
            {
                get
                {
                    return this.value;
                }
            }
            public string StringValue
            {
                get
                {
                    return this.stringValue;
                }
            }
            public IntegerStringPair(int value, string stringValue)
            {
                this.value = value;
                this.stringValue = stringValue;
            }
        }
    }
    

Cc295312.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首

向属性应用值转换器

在以下操作步骤中,在将“Slider”对象的值绑定到两个“Label”对象时,将应用前面代码中的值转换器。所产生的结果是标签会显示“Slider”值的整数和罗马数字表示形式。

  1. 在 Expression Blend 中,向项目中添加 DoubleValueConverter.cs 文件。在“项目”菜单上,单击“添加现有项”,浏览到 DoubleValueConverter.cs 文件,然后单击“打开”。

    Cc295312.alert_note(zh-cn,Expression.10).gif说明:

    确保项目是用 Visual C# 的“语言”选项创建的。或者,可以将 DoubleValueConverter.cs 生成到 .dll 文件中,并向项目中添加对该 .dll 的引用。

  2. 生成项目 (Ctrl+Shift+B) 使项目能够使用该值转换器类。

  3. 从“工具箱”中,将两个“Label”控件和一个“Slider”控件添加到美工板上。布置这些控件,使它们拥有足够的空间。

  4. 在“对象和时间线”下选择“Slider”对象,然后在“属性”面板的“公共属性”下设置以下属性:

    • 将“LargeChange”设置为 10。这是在单击“Slider”时发生的递增变化。

    • 将“Maximum”设置为 2001。“Slider”的范围将从 0 到 2001。

    • 将“SmallChange”设置为 1。这是在使用方向键移动“Slider”时发生的递增变化。

  5. 在“对象和时间线”下选择第一个“Label”对象,然后在“属性”面板的“公共属性”下单击“Content”属性。在显示的下拉列表上单击“数据绑定”。将打开“创建数据绑定”对话框。

  6. 在“元素属性”选项卡上,从“场景元素”下的元素树中选择“Slider”。

  7. 在“元素属性”选项卡上,从“显示”下拉列表中选择“所有属性”,然后在“属性”下选择“Value : (Double)”。这会将标签的内容绑定到滑块的值。

  8. 单击“创建数据绑定”对话框中的“展开”Cc295312.81e110f1-4068-4299-957d-0693cea95088(zh-cn,Expression.10).png 按钮,以查看高级设置。

  9. 在“值转换器”下拉框旁边,单击“添加新的值转换器”按钮。将打开“添加值转换器”对话框。

  10. 依次展开项目的名称和“Microsoft.Expression.Samples”命名空间,选择“DoubleToIntegerValueConverter”,然后单击“确定”。

    Cc295312.alert_tip(zh-cn,Expression.10).gif提示:

    如果未显示所需的值转换器,请确保已将源文件添加到项目中,并且已生成项目 (Ctrl+Shift+B)。

  11. 在“创建数据绑定”对话框中,单击“完成”。此时,第一个“Label”对象将显示滑块的整数表示形式。

    Cc295312.alert_note(zh-cn,Expression.10).gif说明:

    请注意,滑块对象的名称已指定为“Slider”。必须命名应用程序中的对象,才能在应用程序中的其他位置引用这些对象,例如在数据绑定过程中。Expression Blend 会为您设置一个名称。

  12. 对第二个标签重复步骤 5 到步骤 11,但在“添加值转换器”对话框中选择“DoubleToRomanNumeralValueConverter”。

  13. 测试项目 (F5)。移动滑块,以查看值在两个标签中的更新情况。

Cc295312.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-cn,Expression.10).gif返回页首