2012-01-26 37 views
2

我試圖執行驗證屬性。我們有一個可以爲空的屬性叫:使用IValueConverter驗證可爲空的int

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

而且這個屬性綁定到一個文本框。我只是想驗證這兩escenarios:

  • 試想一下,用戶留下的文本框爲空(textbox.text =「」),所以號碼屬性必須接受空值(而不是「」)。
  • 如果用戶輸入「2b」,Number屬性必須有一個空值(因爲是錯誤),但文本框仍然必須說「2b」。

因此,對於這個實現是:

public class IntConverter : IValueConverter 
{ 
    private static readonly IntConverter defaultInstance = new IntConverter(); 

    public static IntConverter Default { get { return defaultInstance; } } 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.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, System.Globalization.CultureInfo culture) 
    { 
     if (value is string) 
     { 
      int number; 
      if (Int32.TryParse((string)value, out number)) 
      { 
       return number; 
      } 
     } 

     return null; 
    } 
} 

上面的代碼是真正的工作,但只有一件事沒有做好。當用戶輸入「2b」時,此時應顯示錯誤(紅色邊框)。我該如何解決它?

注意:驗證屬性爲true。

<TextBox Text="{Binding Number, UpdateSourceTrigger=PropertyChanged, 
     ValidatesOnExceptions=True, ValidatesOnDataErrors=True, NotifyOnValidationError=True, TargetNullValue={x:Static sys:String.Empty}, 
     Converter={x:Static c:IntConverter.Default}}" /> 

回答

2

在視圖模型類中實現IDataErrorInfo接口,而不是使用NullableIntValidation類。

有一個很好的例子here

+0

我已經更新了問題 –

+0

我的答案仍然是一樣的。每當Number屬性爲null時,實現IDataErrorInfo將發生錯誤。 – m0sa

2

爲什麼你需要一個轉換器爲此,WPF綁定是足夠強大的處理這種情況。

  • 首先,如果你將textBox與int綁定在一起?值,並嘗試設置字符串(2b),它會自動在其周圍顯示紅色驗證錯誤邊界。

  • 其次,如果要在空字符串的情況下設置空值,則需要爲綁定設置TargetNullValue

此代碼示例會爲你工作 -

<TextBox Text="{Binding Number, TargetNullValue={x:Static s:String.Empty}, 
       UpdateSourceTrigger=PropertyChanged}"/> 

確保您的命名系統命名空間添加到您的XAML -

xmlns:s="clr-namespace:System;assembly=mscorlib" 
+0

感謝TargetNullValue,我不知道它。但是,當出現錯誤邊界,是不是有辦法將當前值設置爲空?因爲發生這種情況時,它會保持最後一個正確的值。 –

+0

你爲什麼要那樣?無論如何,在這種情況下,你必須去IDataErrorInfo .. –

+0

也許我錯了,但我想IDataErrorInfo是驗證業務規則。這是我不想使用它的原因。 而且還因爲我會在許多意見中做同樣的事情。那麼,是唯一的選擇? –