2016-08-24 2 views
0

Вот код XAML, представляющий TextBox используется в качестве входных данных для IDcardWPF/MVVM Validation

<TextBox.Text> 
    <Binding Mode="TwoWay" 
       Path="IdCardNumber" 
       UpdateSourceTrigger="PropertyChanged"> 
       <Binding.ValidationRules> 
        <v:AlphaNumValidationRule ValidationStep="UpdatedValue" /> 
       </Binding.ValidationRules> 
    </Binding> 
    </TextBox.Text> 

проверки достоверности:

public class AlphaNumValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     if (string.IsNullOrWhiteSpace((value ?? "").ToString())) 
      return new ValidationResult(false, Resources.Strings.MessagesResource.RequiredField); 
     else if (value.ToString().MatchRegex(RegexResource.ALPHANUMERIC)) 
      return new ValidationResult(true, null); 
     else 
      return new ValidationResult(false, Resources.Strings.MessagesResource.InvalidFormat); 
    } 
} 

ViewModel

public override bool IsValid 
    { 
     get { return !string.IsNullOrWhiteSpace(IdCardNumber); } 
    } 
    private string idCardNumber; 
    public string IdCardNumber 
    { 
     get { return idCardNumber; } 
     set { Set(() => IdCardNumber, ref idCardNumber, value); 
      RaisePropertyChanged("IsValid"); 
     } 
    } 

То, что я хочу должны обновлять IsValid каждый раз, когда обновляется вход IdCard, Я пробовал разные Validatio nStep, но никто не делает, как я желаю.

Сначала при загрузке ввода в первый раз IsValid является ложным, при вводе правильного значения он становится истинным после удаления ввода и добавления неправильных не поддерживаемых значений. IsValid остается неизменным, так как он сохраняет последнее правильное значение.

Любой способ решить эту проблему?

+0

Вот мой пост, как использовать проверку: http://stackoverflow.com/questions/19539492/wpf-textbox-validation-c-sharp/37255232#37255232 –

+0

@ Mr.BI хочет определенное поведение, как описано в мой пост для этой проверки –

ответ

1

Вы можете попытаться изменить UpdateSourceTrigger свойство с LostFocus:

<Binding Mode="TwoWay" 
      Path="IdCardNumber" 
      UpdateSourceTrigger="LostFocus"> 
      <Binding.ValidationRules> 
       <v:AlphaNumValidationRule ValidationStep="UpdatedValue" /> 
      </Binding.ValidationRules> 
</Binding> 

Edit:

Чтобы связать результат проверки вы можете использовать HasError свойство:

<TextBox Name="TextBox"> 
      <TextBox.Text> 
       <Binding Mode="TwoWay" 
       Path="Text" 
       UpdateSourceTrigger="PropertyChanged"> 
        <Binding.ValidationRules> 
         <local:AlphaNumValidationRule/> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 
     </TextBox> 
    <TextBlock Text="{Binding (Validation.HasError), ElementName=TextBox}"/> 
+0

Я не хочу использовать LostFocus Я бы хотел, чтобы он обновил IsValid в режиме реального времени. ValidationStep, который вы используете, хранит неправильное значение (из-за использования IsValid getter и проверки только в том случае, если вход пуст или нет), а также предупреждает о неправильном вводе. –

+0

Извините, я не понял ваш вопрос. Почему вам нужен этот «IsValid» boolean? Если вы хотите связать результат проверки, вы можете использовать: '{Binding (Validation.HasError), ElementName = TextBox}' –

+0

И как использовать Validation.HasError с другой стороны (ViewModel)? –

3

Существует приложенный событие Validation.Error, которое запускается при ошибке привязки.

Таким образом, вы можете прикрепить к этому событию и установить значение Validation.HasErrors собственности на свойство IsValid вашего viewmodel.

Я вижу конфликт, однако. Вы определили логику проверки в представлении, но хотите получить доступ к нему в своей модели ViewModel, поэтому у вас возникают проблемы.

Я рекомендую вам переместить всю логику проверки на вашу модель с помощью INotifyDataErrorInfo. то у вас будут все правила проверки и ошибки проверки в вашем распоряжении в viewmodel.

+0

Есть ли какой-нибудь ясный пример этого, поэтому я попробую? –