試してみよう : 値コンバータの作成と適用

このページは WPF および Silverlight 2 に適用されます

値コンバータは、ある型のデータを別の型に変換するための便利な方法です。Microsoft Expression Blend 内のオブジェクトのプロパティをデータ値または他のプロパティにバインドする場合は、データ型が一致する必要があります。たとえば、"123" などのテキスト ボックス文字列をスライダ バーの対応する整数値に変換すること、または Visibility.Hidden などのフィールドを false などのブール値に変換することができます。

値コンバータは、Microsoft .NET Framework クラスのコードに IValueConverter インターフェイスを実装します。Convert メソッドと ConvertBack メソッドの両方を実装する必要があります。これは、バインド ソースとバインド先の間で値を移動するときに、データ バインド エンジンからこれらのメソッドが呼び出されるためです。詳細については、MSDN ライブラリの「IValueConverter インターフェイス」を参照してください。

値コンバータを適用するには、データをプロパティにバインドするときに、[データ バインドの作成] ダイアログ ボックスの [値コンバータ] フィールドに入力します。

Cc295312.alert_note(ja-jp,Expression.10).gifメモ :

このトピックの 2 番目の手順では、要素から要素へのバインドを使用して、値コンバータを適用します。このバインド方法は Silverlight 2 ではサポートされていませんが、CLR データ ソースを使用するデータ バインド操作に対しては、値コンバータを適用できます。

値コンバータ クラスを作成するには

  • 次のコードを DoubleValueConverter.cs というファイルに貼り付けます。このコードには次の 2 つの値コンバータが含まれます。

    • DoubleToIntegerValueConverter には、Double 値と Integer 値の双方向の変換機能があります。

    • DoubleToRomanNumeralValueConverter には、Double 値からローマ数字の文字列表記への一方向の変換機能があります。

    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(ja-jp,Expression.10).gif先頭に戻る

値コンバータをプロパティに適用するには

次の手順では、値が 2 つの Label オブジェクトにバインドされているときに、上記のコードの値コンバータが Slider オブジェクトの値に適用されます。その結果、ラベルには Slider 値の整数表記とローマ数字表記が表示されます。

  1. Expression Blend のプロジェクトに DoubleValueConverter.cs ファイルを追加します。[プロジェクト] メニューの [既存のアイテムを追加] をクリックし、DoubleValueConverter.cs ファイルを参照して [開く] をクリックします。

    Cc295312.alert_note(ja-jp,Expression.10).gifメモ :

    プロジェクトが Visual C# の [言語] オプションで作成されていることを確認してください。または、DoubleValueConverter.cs ファイルを .dll ファイルにビルドし、その .dll への参照をプロジェクトに追加することもできます。

  2. プロジェクトをビルドし (Ctrl + Shift + B キー)、プロジェクトに使用できる値コンバータ クラスを作成します。

  3. [ツールボックス] から 2 つの Label コントロールと 1 つの Slider コントロールをアートボードに追加します。十分な余白があるようにレイアウトします。

  4. [オブジェクトとタイムライン] の Slider オブジェクトを選択した状態で、[プロパティ] パネルの [共通プロパティ] で次のプロパティを設定します。

    • LargeChange を 10 に設定します。Slider をクリックすると、増分の変化が発生します。

    • Maximum を 2001 に設定します。Slider の範囲は 0 ~ 2001 になります。

    • SmallChange を 1 に設定します。方向キーを使用して Slider を移動すると、増分の変化が発生します。

  5. [オブジェクトとタイムライン] で 1 番目の Label オブジェクトを選択した状態で、[プロパティ] パネルの [共通プロパティ] の下にある Content プロパティをクリックします。表示されるドロップダウン リストの [データ バインド] をクリックします。[データ バインドの作成] ダイアログ ボックスが表示されます。

  6. [要素プロパティ] タブの [シーン要素] の下にある要素のツリーから [Slider] を選択します。

  7. [要素プロパティ] タブで、[表示] ドロップダウン リストの [すべてのプロパティ] を選択して、[プロパティ] の下の [Value : (Double)] を選択します。ラベルのコンテンツがスライダの値にバインドされます。

  8. [データ バインドの作成] ダイアログ ボックスの [展開] Cc295312.81e110f1-4068-4299-957d-0693cea95088(ja-jp,Expression.10).png ボタンをクリックして、詳細設定を表示します。

  9. [値コンバータ] ドロップダウン ボックスの横にある [新しい値コンバータの追加] ボタンをクリックします。[値コンバータの追加] ダイアログ ボックスが表示されます。

  10. プロジェクト名と Microsoft.Expression.Samples 名前空間を展開し、DoubleToIntegerValueConverter を選択して、[OK] をクリックします。

    Cc295312.alert_tip(ja-jp,Expression.10).gifヒント :

    値コンバータが表示されない場合、ソース ファイルをプロジェクトに追加したことと、プロジェクトをビルドしたこと (Ctrl + Shift + B キー) を確認します。

  11. [データ バインドの作成] ダイアログ ボックスの [完了] をクリックします。1 番目の Label オブジェクトには、スライダの整数表記が表示されるようになります。

    Cc295312.alert_note(ja-jp,Expression.10).gifメモ :

    スライダ オブジェクトには Slider という名前が付いています。アプリケーション内のオブジェクトは、データ バインド時などにアプリケーションの他の場所から参照できるように名前を付ける必要があります。Expression Blend によって名前が設定されます。

  12. 2 番目のラベルについては手順 5 ~ 11 を繰り返します。ただし、[値コンバータの追加] ダイアログ ボックスでは DoubleToRomanNumeralValueConverter を選択します。

  13. プロジェクトをテストします (F5 キー)。スライダを移動すると、2 つのラベルに更新された値が表示されます。

Cc295312.7e183f1f-37d8-4dcb-980c-19a5d61ca087(ja-jp,Expression.10).gif先頭に戻る