2012-01-25 3 views
2

Я пытаюсь выполнить свойство проверки. У нас есть свойство nullable:Как проверить данные в WPF и установить значение по умолчанию?

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

И это свойство связано с текстовым полем. Я только хочу, чтобы проверить это два escenarios:

  • Представьте, что пользователь оставил текстовое поле пустым (TextBox.Text = «»), так что номер свойство должно получить нулевое значение (вместо «»).
  • И если пользователь вводит «2b», свойство Number должно иметь нулевое значение (потому что это ошибка), но текстовое поле должно все еще указывать «2b».

Я думаю, что IDataNotifyError и ValidationRules не работают для этого. Как я могу разрешить эти ситуации?

EDIT: Я также использую ValidationRule для отображения пользовательского сообщения, когда пользователь вводит неверный формат. Но когда это происходит, не убирает свойство null. И если значение true в этой ошибке, оно запускается, но не отображается сообщение об ошибке.

    <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

Try следующий конвертер:

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 является ложным, не запускайте свойство. –

2

Вы можете использовать конвертер и манипулировать значениями, прежде чем они назначены закладываемого имущества.

0

Использование @ преобразователя Amit, а затем, чтобы получить эту ошибку, используйте 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 datatype (int?) –

+0

Конвертер Armit преобразует недопустимые числа в null. После этого будет проверен метод IDataErrorInfo. Поэтому нулевое значение будет означать, что введен неверный номер. –

Смежные вопросы