2012-01-25 10 views
2

私は検証プロパティを実行しようとしています。WPFでデータを検証し、デフォルト値を設定する方法は?

public int? Number 
    { 
     get { return _number; } 
     set 
     { 
      if (_number != value) 
      { 
       _number = value; 
       RaisePropertyChanged("Number"); 
      } 
     } 
    } 

このプロパティはテキストボックスにバインドされています。

  • ユーザーがテキストボックスを空(textbox.text = "")のままにしているので、Numberプロパティはnull値(代わりに "")を受け取る必要があるとします。
  • ユーザーが "2b"を入力した場合、NumberプロパティはNULL値を持つ必要があります(エラーであるため)。ただし、テキストボックスには "2b"と表示されている必要があります。

IDataNotifyErrorとValidationRulesはこれで動作していないと思います。どのようにこれらの状況を解決できますか?

編集:ユーザーが間違った形式を入力したときに、カスタムメッセージを表示するためにValidationRuleも使用しています。しかし、これが起こると、nullにプロパティを起動しません。そしてそのエラーに真を当てはめると、それは起動しましたが、エラーメッセージは表示されません。

    <TextBox.Text> 
        <Binding Path="Number" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" ValidatesOnExceptions="True" NotifyOnValidationError="True" Converter="{x:Static c:IntConverter.Default}" > 
         <Binding.ValidationRules> 
           <r:NumericValidation /> 
         </Binding.ValidationRules> 
        </Binding> 
       </TextBox.Text> 

検証ルール

public class NumericValidation : ValidationRule 
{ 
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) 
    { 
     int? response; 
     bool noIllegalChars = TryParseStruct<int>(value.ToString(), out response); 

     if (noIllegalChars == false) 
     { 
      return new ValidationResult(false, "Input is not in a correct format."); 
     } 
     else 
     { 
      return new ValidationResult(true, null); 
     } 
    } 

    ... 
} 
+0

この状況でValidationRulesはどのように機能しませんか? –

+0

@Kai検証は単に検証のためのいくつかの制約をユーザに通知するためのものです。私は、この場合のように論理を扱っていないことを意味します。 –

答えて

3

てみてください、次のコンバータ:

public class IntConverter : IValueConverter 
{ 
    public object Convert(object value, 
          Type targetType, 
          object parameter, 
          CultureInfo culture) 
    { 
     if (value is int?) 
     { 
      int? intValue = (int?)value; 
      if (intValue.HasValue) 
      { 
       return intValue.Value.ToString(); 
      } 
     } 

     return Binding.DoNothing; 
    } 

    public object ConvertBack(object value, 
           Type targetType, 
           object parameter, 
           CultureInfo culture) 
    { 
     if(value is string) 
     { 
      int number; 
      if (Int32.TryParse((string)value, out number)) 
      { 
       return number; 
      } 
     } 

     return null; 
    } 
} 
+0

うわー、これは美しいです、私はコンバータについては全く知らないです。すべては大丈夫ですが、 "8b"を入力すると、プログラムは大丈夫だと判断し、この時点でプロパティをnullに更新しません。あなたはそれを修正する方法を知っていますか? –

+0

"8b"の場合にプロパティに設定する内容。コンバータのConvertBackメソッドにブレークポイントを入れて、それが何を返すかを確認してください。 – Amit

+0

さて、私は、検証規則も使用していると伝えておきます。これはちょうど間違ったフォーマットを入力したときにカスタムメッセージを表示し、ValidationResultsがfalseのときにプロパティを起動しないことに気付きました。 –

2

あなたがコンバータを使用し、それらは基本的なプロパティに割り当てられている前に、値を操作することができます。

0

使用アミットのコンバータ@、その後、エラーが次のコードでIDataErrorInfoを使用取得する:

public string this[string columnName] 
{ 
    get 
    { 
     if (columnName == "Number") 
     { 
      if (Number == null) return "Invalid number"; 
     } 

     return null; 
    } 
} 

またはあなたのValidationRuleでそれを行うことができますが、あなたは希望そのValidationStepプロパティを変更する必要があります。あなたの検証は、デフォルトの時間RawProposedValue、つまりコンバーターが起動する前に起動されています。

+0

@Armit Numberがnullである理由を理解できません。NumberはNullableデータ型(int?)なので、私は言った –

+0

Armitのコンバータは無効な数値をnullに変換します。その後、IDataErrorInfoのメソッドが呼び出されて検証されます。したがって、ヌル値は、無効な数値が入力されたことを意味します。 –

関連する問題