动手试验:将数据从一种类型转换为另一种类型
值转换器是转换数据类型的一种简便方法。在 Microsoft Expression Blend 中将对象的属性值绑定到数据值或其他属性值时,值类型必须匹配。例如,对于滑块条,可能需要将文本框字符串(如“123”)转换为对应的整数值,或者将属性(例如“Visibility.Hidden”)转换为布尔值(例如 false)。
值转换器利用 Microsoft .NET Framework 类中的代码实现 IValueConverter 接口。必须实现 Convert 和 ConvertBack 方法,因为数据绑定引擎在绑定源和绑定目标之间移动值时需要调用这些方法。有关详细信息,请参阅 MSDN 上的 IValueConverter 接口。
若要应用值转换器,只需在将数据绑定到属性时填写“创建数据绑定”对话框中的“值转换器”字段。
创建值转换器类
此过程提供了用 C# 编写的 .NET 类的示例,该类只能添加到已为其代码隐藏文件使用 C# 的项目。但是,可以通过多种方式向项目中添加代码。或者,可以使用 Microsoft Visual Studio 将类编译为 .dll,然后向项目中添加对该 .dll 文件的引用。
有关详细信息,请参阅添加或删除引用。
在“项目”面板中右键单击项目,然后单击“添加新项”。
在“新建项”对话框中,单击“类”,在“名称”字段中输入 DoubleValueConverter.cs,然后单击“确定”。
将采用解决方案使用的语言创建一个新代码文件。在此过程中,此语言为 C#。文件将添加到项目,并在美工板上打开。
在 DoubleValueConverter.cs 文件中,删除以下类定义:
public class DoubleValueConverter { public DoubleValueConverter() { // Insert code required on object creation below this point. } }
将删除的代码替换为以下代码,其中包含如下两个值转换器类:
DoubleToIntegerValueConverter 提供双精度值与整数值之间的双向转换。
DoubleToRomanNumeralValueConverter 提供从双精度值到罗马数字的字符串表示形式的单向转换。
/// <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> /// DoubleToRomanNumeralValueConverter 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; } }
(按 Ctrl+Shift+B)生成解决方案以确定是否有任何错误。
提示: 生成操作将编译代码文件,并使类可用于 Expression Blend(例如,在“创建数据绑定”对话框中)。如果向代码文件中添加新类,则必须重新生成解决方案以使这些类可用于 Expression Blend。
向属性应用值转换器
在以下过程中,在将“Slider”对象的值绑定到两个“TextBox”对象时,将应用前面过程中的值转换器。所产生的结果是文本框会显示“Slider”值的整数和罗马数字表示形式。
在“工具”面板中,右键单击底部的工具组,然后从出现的列表中选择“Slider” 控件。
在主文档中的美工板上绘制一个滑块控件。
在新的滑块对象处于选定状态的情况下,在“属性”面板中的“公共属性”下找到以下属性,并按如下方式设置它们的值:
将“LargeChange”设置为 10。这是在单击滑块条时发生的递增变化。
将“Maximum”设置为 2001。滑块的范围将为 0 到 2001。
将“SmallChange”设置为 1。这是在使用箭头键移动滑块时发生的递增变化。
在“工具”面板中,右键单击底部的倒数第二个工具组,然后从出现的列表中选择“TextBox” 控件。
在美工板上滑块对象的旁边绘制两个文本框控件。
在第一个文本框对象处于选定状态的情况下,在“属性”面板中的“公共属性”下找到“Text”属性。您会将“Text”属性绑定到滑块的值。
单击“高级属性选项”,然后从出现的列表中单击“数据绑定”。
在“创建数据绑定”对话框中,单击“元素属性”选项卡。您将在此选项卡中将内部值绑定到属性。
展开“场景元素”下的元素树,然后选择“[Slider]”对象。
在“属性”下,选择“Value : (Double)”。
这会将文本框的内容绑定到滑块的值。
单击“显示高级属性”,然后在“值转换器”的旁边,单击“添加新的值转换器”。
在“添加值转换器”对话框中,选择“DoubleToIntegerValueConverter”,然后单击“确定”。
提示: 如果看不到值转换器,请确保已将在前面过程中创建的源文件 DoubleValueConverter.cs 添加到项目中,并且已生成项目(按 Ctrl+Shift+B)。
在“创建数据绑定”对话框中,单击“确定”。
此时,第一个“Label”对象将显示滑块的整数表示形式。
说明: 请注意,滑块对象的名称已指定为“slider”。必须为应用程序中的对象命名,才能在应用程序中的其他位置引用这些对象,例如在数据绑定过程中。Expression Blend 会为您创建一个名称。
对第二个文本框重复步骤 6 到步骤 13,但这一次在“添加值转换器”对话框中选择“DoubleToRomanNumeralValueConverter”。
运行项目(按 F5)。移动滑块,以查看值在两个标签中的更新情况。
如果不使用值转换器,则显示滑块值的文本框将显示多个小数位。