web-dev-qa-db-ja.com

IValueConverterインターフェイスでConvertBackメソッドの使用は何ですか?

ConvertBackインターフェースでのIValueConverterメソッドの使用法は何ですか。

いつ呼び出されますか?

または、ConvertおよびConvertBackメソッドの呼び出しの順序とは何ですか?

ここで質問をしました。私は分離コードの1つのプロパティをTEXTBOXのTEXTプロパティにバインドし、そのプロパティにconvertorを使用しています。最初のConvertメソッドが呼び出され、TEXTTEXTBOXを変更しても何も起こりません...しかし、フォームを閉じるとすぐにConvertBackメソッドが呼び出されます。

43

IMO、ConvertBackメソッドは、データの視覚表現を特定のDataTypeに変換するために使用されます。

たとえば、コンバーターを使用してブール値trueを文字列"TrueBoolean"に変換します。このテキストはTextBoxに表示されます。 TextBoxの値を変更すると、バインディングが再度発生するとすぐにConvertBackメソッドが呼び出されます(デフォルトはOnFocusLost)。これでConvertBackメソッドは、新しい値を希望するデータ型に変換しようとします。したがって、"FalseBoolean"falseに変換するロジックを実装する必要があります。

public class Converter : IValueConverter
{
    object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool) value ? "TrueBoolean" : "FalseBoolean";
    }

    object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var s = (string) value;
        if (s.Equals("TrueBoolean",StringComparison.CurrentCultureIgnoreCase))
            return true;
        if (s.Equals("FalseBoolean", StringComparison.CurrentCultureIgnoreCase))
            return false;
        throw new Exception(string.Format("Cannot convert, unknown value {0}", value));
    }
}

この手法は、間違いがない限り、DataGridでよく使用されます。

これが少し明確であることを願っています...

[〜#〜]更新[〜#〜]
コメント内のあなたの質問について:
デフォルトのOnFocusLostバインディング動作を上書きするには、バインディングを次のように変更する必要があります:

<TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}"/>
<!--syntax might differ, can't access VS at the moment.-->
42
RoelF

ConvertBackmode=TwoWayバインディングに。

ユーザー入力をバインド先のデータ型に変換し、TextBox(たとえば)がフォーカスを失ったときに呼び出されます。

たとえば(これが組み込まれていない場合)、価格を表す数値がある場合、Convertメソッドは値を受け取り、正しい通貨記号、小数点記号などを使用して文字列にフォーマットします。

ユーザーが新しい値を入力した場合-可能な通貨記号、桁区切り記号などを含めて、ConvertBackメソッドを使用して文字列を解析し、数値を抽出します。

別の例として、クレジットカード番号の入力があります。ユーザーは、数字またはスペースまたはダッシュで区切られた数字のグループの単一の文字列として数値を入力できます。 ConvertBackメソッドは、これらすべての可能な入力を受け取り、それらを必要な単一の形式に変換します。

32
ChrisF

バインディングのUpdateSourceTriggerプロパティを確認してください。 http://msdn.Microsoft.com/library/system.windows.data.binding.updatesourcetrigger.aspx

テキストボックスは、フォーカスを失うとデフォルトでソースを更新します。UpdateSourceTriggerを使用して、テキストボックスのコンテンツが変更された場合にソースの即時更新にこの動作を設定できます。

HTHドミニク

3
Dominik