試試看:將資料從某種類型轉換成另一種類型

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

值轉換器會在 Microsoft .NET Framework 類別的程式碼中實作 IValueConverter 介面。 ConvertConvertBack 方法都必須實作,因為資料繫結引擎在繫結來源和繫結目標之間移動值時會呼叫這些方法。如需詳細資訊,請參閱 MSDN 上的 IValueConverter 介面 Cc295312.xtlink_newWindow(zh-tw,Expression.40).png

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

建立值轉換器類別

此程序提供以 C# 撰寫的 .NET 類別範例,該類別只能新增至已將 C# 用於程式碼後置檔案的專案。不過,將程式碼新增至專案的方式不只一種。您也可以使用 Microsoft Visual Studio 將類別編譯成 .dll,然後在專案中新增該 .dll 檔案的參照。

如需詳細資訊,請參閱新增或移除參照

  1. 以滑鼠右鍵按一下 [專案] 面板中的專案,然後按一下 [新增項目]。

  2. 在 [新增項目] 對話方塊中按一下 [類別],並將 DoubleValueConverter.cs 輸入 [名稱] 欄位,然後按一下 [確定]。

    新的程式碼檔案會以您的解決方案所使用的語言建立。為了配合此程序的目的,此語言為 C#。該檔案會新增至您的專案並在畫板上開啟。

  3. 在 DoubleValueConverter.cs 檔案中,刪除下列類別定義:

    public class DoubleValueConverter
    {
        public DoubleValueConverter()
        {
            // Insert code required on object creation below this point.
        }
    }
    
  4. 使用包含以下兩個值轉換器類別的下列程式碼,取代刪除的程式碼:

    • 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;
            }
        }
    
  5. 建置 (CTRL+SHIFT+B) 解決方案以查看是否有任何問題。

    tip note秘訣:

    建置會編譯程式碼檔案並使類別可供 Expression Blend 使用 (例如在 [建立資料繫結] 對話方塊中)。如果您將新類別加入至程式碼檔案,必須重建解決方案以使其可供 Expression Blend 使用。

將值轉換器套用至屬性

在下列程序中,當您將 Slider 物件的值繫結至兩個 TextBox 物件時,會套用上述程序中的值轉換器。結果是讓文字方塊顯示 Slider 值的整數和羅馬數字表示法。

  1. 在 [工具] 面板中,以滑鼠右鍵按一下底部工具群組,然後從顯示的清單中選取 Slider 控制項 Cc295312.b478d0b9-7525-47cb-b633-0007e08432d4(zh-tw,Expression.40).png

  2. 在主文件中的畫板上繪製滑桿控制項。

  3. 選取新的滑桿物件後,在 [屬性] 面板中的 [一般屬性] 下找出下列屬性,並依下列方式設定其值:

    • 將 [LargeChange] 設為 10。這是當您按一下滑桿時所進行的漸進式變更。

    • 將 [Maximum] 設為 2001。滑桿會從 0 變成 2001。

    • 將 [SmallChange] 設為 1。這是當您使用方向鍵移動滑桿時所進行的漸進式變更。

  4. 在 [工具] 面板中,以滑鼠右鍵按一下底部第二個工具群組,然後從顯示的清單中選取 TextBox  Cc295312.b5206bf1-18c8-491f-8239-3e542b2ca147(zh-tw,Expression.40).png 控制項。

  5. 在畫板上的滑桿物件旁繪製兩個文字方塊控制項。

  6. 選取第一個文字方塊物件後,在 [屬性] 面板中的 [一般屬性] 下找出 Text 屬性。將 Text 屬性繫結至滑桿的值。

  7. 按一下 [進階選項] Cc295312.12e06962-5d8a-480d-a837-e06b84c545bb(zh-tw,Expression.40).png,然後在顯示的清單中按一下 [資料繫結]。

  8. 在 [建立資料繫結] 對話方塊中,按一下 [元素屬性] 索引標籤。您可在此將內部值繫結至屬性。

  9. 在 [場景元素] 下展開元素樹狀目錄,然後選取 [Slider] 物件。

  10. 在 [屬性] 下,選取 [Value : (Double)]。

    如此會將文字方塊的內容繫結至滑桿的值。

  11. 按一下 [顯示進階屬性] Cc295312.de239c9d-42ce-4f5e-83b9-5f9924c0431f(zh-tw,Expression.40).png,然後在 [值轉換器] 旁,按一下 [新增值轉換器] Cc295312.3f9fe48b-caf8-4989-8a91-017ba1e0cb77(zh-tw,Expression.40).png

  12. 在 [新增值轉換器] 對話方塊中,選取 DoubleToIntegerValueConverter ,然後按一下 [確定]。

    tip note秘訣:

    如果您看不到值轉換器,請確定您在上述程序中建立的來源檔案 (DoubleValueConverter.cs) 已新增至專案,而且您已建置專案 (CTRL+SHIFT+B)。

  13. 在 [建立資料繫結] 對話方塊中,按一下 [確定]。

    第一個 Label 物件現在會顯示滑桿的整數表示法。

    Note注意:

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

  14. 針對第二個文字方塊重複步驟 6 到 13,但這次請在 [新增值轉換器] 對話方塊中選取 DoubleToRomanNumeralValueConverter

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

    Cc295312.f1241b72-d14a-4de2-9d99-332418f84561(zh-tw,Expression.40).png

    如果不使用值轉換器,顯示滑桿值的文字方塊會顯示許多小數位數。

    Cc295312.0279e814-a5af-4322-84d4-754083a57f83(zh-tw,Expression.40).png

另請參閱

工作

將物件繫結至使用者輸入或其他內部值

概念

指定顯示資料之控制項的樣式
顯示資料

Copyright © 2011 by Microsoft Corporation. All rights reserved.