この1年ほどの間に、さまざまな作者から、さまざまな目的のためにさまざまな値コンバーターを見てきました。私の頭の中で際立っているのは、それらによって返される「デフォルト」値の広い変動です。例えば;
public class MyConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// OK, we test for some undesirable, unconvertable situation, typically null...
if (value == null)
{
// And here are a variety of 'defaults' that I have seen, these begin the most typical.
return null;
return DependencyProperty.UnsetValue;
return Binding.DoNothing;
}
//...... other code.. whatever...
}}
だから私の質問は、入力値が変換できないことを示す「標準」の方法はありますか?
多くの検討と検討の結果、DependencyProperty.UnsetValueが適切な選択のようです。私は家の中のすべてをこのパターンに移し、大成功を収めました。また、 このページ の「備考」セクションのテキストは、これがおそらく最良の選択であることを示しています。
バインディングを変換できない場合に入力値を返すことについての議論もありますが、これはバインディングシステムを簡単に「破壊」する可能性があります。バインディング入力が「文字列」で、出力が「ブラシ」である場合を考えてください。文字列を返すことはうまくいきません!
MSDN-IValueConverter によると:
データバインディングエンジンは、ユーザー指定のコンバーターによってスローされる例外をキャッチしません。 Convertメソッドによってスローされる例外、またはConvertメソッドが呼び出すメソッドによってスローされるキャッチされない例外は、ランタイムエラーとして扱われます。 DependencyProperty.UnsetValue を返すことにより、予想される問題を処理します。
キーラインは DependencyProperty.UnsetValueを返すことにより、予想される問題を処理します。
これらの値を調べると、それらの意味がわかります。次に、適切なものを選択して、コンバータに戻します。
主な問題は、nullがプロパティの有効な値である可能性があることです。
DependencyProperty.UnsetValue プロパティは存在するが、プロパティシステムによって値が設定されていないことを示します
Binding.DoNothing バインディングエンジンに、値をバインディングターゲットに転送しない、PriorityBindingの次のバインディングに移動しない、FallBackValueまたはデフォルト値を使用しないように指示する
[〜#〜]編集[〜#〜]
値を変換できないことを示すには、単に指定された値を返す必要があります。それはバインディングの作成者に問題を返すため、あなたができる最善の方法です。値をいじくると、何が起こっているのかを見つけるのが非常に難しくなります。
デフォルトとして何を返すかは、状況によって異なります。コンバーターのデフォルトとしてintをブール値に戻したり、可視性列挙型のコンバーターのブール値を戻したりしたくない場合。
通常、値を変換できない場合は、Exception
をスローします
これは、無効なコンバーターを使用して値を変換しようとしている場合に、コードを変更できるようにアラートが表示されるようにしたいためです。
まれに、変換できない場合でも値が有効になることがあります。その場合、通常はコンバーターに渡されたものと同じ値を返します。これは、可能であれば値を変換する場合、または変換しない場合はそのままにする場合にのみ使用されます。
私が時々行ったもう1つのまれなケースは、デフォルト値をハードコーディングすることです。これは通常、Converterが無効なパラメーターで使用されている可能性があることがわかっていて、結果が何であっても有効な値を返したい場合に行われます。ハードコードされたデフォルトのコンバーターは、ほとんどの場合ブール値を返します。
指定した3つ(null
、DependencyProperty.UnsetValue
、またはBinding.DoNothing
)これらの値は予期しないことが多く、特に探しない限り気づきにくいためです。