ConvertBack
インターフェースでのIValueConverter
メソッドの使用法は何ですか。
いつ呼び出されますか?
または、Convert
およびConvertBack
メソッドの呼び出しの順序とは何ですか?
ここで質問をしました。私は分離コードの1つのプロパティをTEXTBOXのTEXTプロパティにバインドし、そのプロパティにconvertor
を使用しています。最初のConvert
メソッドが呼び出され、TEXT
のTEXTBOX
を変更しても何も起こりません...しかし、フォームを閉じるとすぐにConvertBack
メソッドが呼び出されます。
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.-->
ConvertBack
はmode=TwoWay
バインディングに。
ユーザー入力をバインド先のデータ型に変換し、TextBox
(たとえば)がフォーカスを失ったときに呼び出されます。
たとえば(これが組み込まれていない場合)、価格を表す数値がある場合、Convert
メソッドは値を受け取り、正しい通貨記号、小数点記号などを使用して文字列にフォーマットします。
ユーザーが新しい値を入力した場合-可能な通貨記号、桁区切り記号などを含めて、ConvertBack
メソッドを使用して文字列を解析し、数値を抽出します。
別の例として、クレジットカード番号の入力があります。ユーザーは、数字またはスペースまたはダッシュで区切られた数字のグループの単一の文字列として数値を入力できます。 ConvertBack
メソッドは、これらすべての可能な入力を受け取り、それらを必要な単一の形式に変換します。
バインディングのUpdateSourceTriggerプロパティを確認してください。 http://msdn.Microsoft.com/library/system.windows.data.binding.updatesourcetrigger.aspx
テキストボックスは、フォーカスを失うとデフォルトでソースを更新します。UpdateSourceTriggerを使用して、テキストボックスのコンテンツが変更された場合にソースの即時更新にこの動作を設定できます。
HTHドミニク