試試看:建立及套用值轉換器

本頁適用於 WPF 和 Silverlight 2

值轉換器可以輕鬆將資料從某種類型轉換成另一種類型。當您在 Microsoft Expression Blend 中將物件的屬性繫結至資料值或其他屬性時,資料類型須相符。例如,您可以將文字方塊字串 (如 123) 轉換成其在滑桿的對應整數值,或將欄位 (如 Visibility.Hidden) 轉換成布林值 (如 false)。

值轉換器會在 [Microsoft .NET Framework] 類別的程式碼中實作 [IValueConverter] 介面。Convert 和 ConvertBack 方法都必須實作,因為資料繫結引擎在繫結來源和繫結目標之間移動值時會呼叫這些方法。如需詳細資訊,請參閱 MSDN 文件庫IValueConverter 介面 (英文)。

若要套用值轉換器,只要在將資料繫結至屬性時,完成 [建立資料繫結] 對話方塊的 [值轉換器] 欄位即可。

Cc295312.alert_note(zh-tw,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-tw,Expression.10).gif回到頁首

將值轉換器套用至屬性

在下列程序中,當您將 [Slider] 物件的值繫結至兩個 [Label] 物件時,會套用上述程式碼中的值轉換器。結果是讓標籤顯示 [Slider] 值的整數和羅馬數字表示法。

  1. 在 Expression Blend 中,將 DoubleValueConverter.cs 檔案新增至您的專案。在 [專案] 功能表上,按一下 [新增現有項目],瀏覽至 DoubleValueConverter.cs 檔案,然後按一下 [開啟]。

    Cc295312.alert_note(zh-tw,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-tw,Expression.10).png 按鈕,以檢視進階設定。

  9. 在 [值轉換器] 下拉式方塊的旁邊,按一下 [新增值轉換器] 按鈕。[新增值轉換器] 對話方塊會隨即開啟。

  10. 展開專案的名稱和 [Microsoft.Expression.Samples] 命名空間,選取 [DoubleToIntegerValueConverter],然後按一下 [確定]。

    Cc295312.alert_tip(zh-tw,Expression.10).gif秘訣:

    如果您看不到值轉換器,請確定來源檔案已新增至專案,而且您已建置專案 (CTRL+SHIFT+B)。

  11. 在 [建立資料繫結] 對話方塊中,按一下 [完成]。第一個 [Label] 物件現在會顯示滑桿的整數表示法。

    Cc295312.alert_note(zh-tw,Expression.10).gif注意事項:

    請注意,滑桿物件的名稱為 Slider。您必須命名應用程式中的物件,這樣才可以在應用程式的其他位置中參照這些物件,例如在進行資料繫結時參照這些物件。Expression Blend 會為您設定名稱。

  12. 針對第二個標籤重複步驟 5 到 11,但在 [新增值轉換器] 對話方塊中選取 [DoubleToRomanNumeralValueConverter]。

  13. 測試您的專案 (F5)。移動滑桿以查看在兩個標籤中更新的值。

Cc295312.7e183f1f-37d8-4dcb-980c-19a5d61ca087(zh-tw,Expression.10).gif回到頁首