46

昨年かそこらの間、私はさまざまな目的のために、さまざまな作成者からさまざまな値コンバーターを見てきました。私の心に突き出ていることの 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...
}}

私の質問は、入力値を変換できないことを示す「標準的な」方法はありますか?

4

6 に答える 6

34

MSDNによると- IValueConverter :

データ バインディング エンジンは、ユーザー指定のコンバーターによってスローされた例外をキャッチしません。Convert メソッドによってスローされる例外、または Convert メソッドが呼び出すメソッドによってスローされるキャッチされない例外は、実行時エラーとして扱われます。DependencyProperty.UnsetValueを返すことで、予想される問題を処理します。

重要な行は、DependencyProperty.UnsetValue を返すことによって予想される問題を処理することです。

于 2011-10-10T14:52:17.177 に答える
25

これらの値を調べると、それらが何を意味するのかがわかります。次に、適切なものを選択してコンバーターに戻します。

主な問題は、nullがプロパティの有効な値である可能性があることです。

DependencyProperty.UnsetValueは、プロパティが存在するが、プロパティシステムによって値が設定されていないことを示します

Binding.DoNothingは、値をバインディングターゲットに転送しないように、PriorityBindingの次のバインディングに移動しないように、またはFallBackValueまたはデフォルト値を使用しないようにバインディングエンジンに指示します。

編集

値を変換できないことを示すには、指定された値を返すだけです。バインディングの作成者に問題が返されるため、これが最善の方法です。値に干渉すると、何が起こっているのかを見つけるのが非常に難しくなります。

于 2011-05-13T13:48:57.593 に答える
5

よく考えて掘り下げた結果、 DependencyProperty.UnsetValueが適切な選択であると思われます。私は社内のすべてをこのパターンに移行し、多くの成功を収めました。また、このページの「備考」セクションのテキストは、これがおそらく最良の選択であることを示しています..

バインディングを変換できない場合に入力値を返すことについても議論がありますが、これはバインディング システムを簡単に「壊す」可能性があります。バインディングの入力が「文字列」で、出力が「ブラシ」の場合を考えてみてください。文字列を返すことはうまくいきません!

于 2011-10-07T19:23:40.810 に答える
2

デフォルトとして何を返すかは、状況によって異なります。コンバーターのデフォルトとしてintをboolに返したり、可視性列挙型のコンバーターのboolを返したりする必要はありません。

于 2011-05-13T13:50:17.543 に答える
1

通常、値を変換できない場合は、Exception

これは、無効なコンバーターを使用して値を変換しようとした場合に、コードを変更できるように警告を受けたいためです。

まれに、変換できない値でも有効な場合があり、その場合は通常、コンバーターに渡された値と同じ値を返します。これは、可能であれば値を変換したい場合、またはそうでない場合は同じままにしたい場合にのみ使用されます。

私が時々行った別のまれなケースは、デフォルト値をハードコーディングすることです。これは通常、Converter が無効なパラメータで使用されている可能性があり、結果がどうであれ有効な値を返したい場合に行われます。私のハードコーディングされたデフォルトのコンバーターは、ほとんどの場合ブール値を返します。

nullあなたが指定した 3 つの値 ( 、DependencyProperty.UnsetValue、または)のいずれも返したことはないと思いますBinding.DoNothing。これらの値は、多くの場合、予期しないものであり、具体的に探さない限り簡単には気付かないためです。

于 2011-10-07T19:36:18.483 に答える
-4

targetTypeこの関数を使用して、実際のデフォルト オブジェクトを返すこともできます。

public static object GetDefault(Type type)
{
   if(type.IsValueType)
   {
      return Activator.CreateInstance(type);
   }
   return null;
}

ソース: C# - default(Type) と同等のプログラム

于 2011-05-13T15:03:45.680 に答える