2015-11-04 3 views
0

У меня есть следующий код в моем приложении WPF, и я пытаюсь выполнить проверку ввода.WPF/Caliburn.Micro - Входная проверка с использованием IDataErrorInfo

Модель:

public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

ViewModel:

public class CustomerViewModel : Screen, IDataErrorInfo 
{ 
    private Customer _customer; 
    public Customer Customer 
    { 
     get { return _customer; } 
     set 
     { 
      if (_customer != value) 
      { 
       _customer = value; 
       NotifyOfPropertyChange(() => Customer); 
      } 
     } 
    } 

    public string Error 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public string this[string columnName] 
    { 
     get 
     { 
      string result = null; 
      if (columnName == "Name") 
      { 
       if (string.IsNullOrEmpty(Customer.Name)) 
        result = "Please enter a Name"; 
       if (Customer.Name.Length < 3) 
        result = "Name is too short"; 
      } 
      return result; 
     } 
    } 
} 

Вид:

<TextBox Text="{Binding Customer.Name, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"/> 

Проблема: Решение не работает, как ожидалось. Ничего не происходит, когда данные типа в текстовом поле. Я не уверен, что погода последовала за правильными шагами.

Может ли кто-нибудь мне помочь?

+0

Как насчет того, чтобы попробовать «UpdateSourceTrigger = PropertyChanged»? –

ответ

1

Я предполагаю, что проблема возникла из-за отсутствия Name недвижимости в вашей модели (но внутри класса Customer). Ваша работа с вложенным свойством в вашей привязке Customer.Name.

Я не использовал это в сочетании с подтверждением IDataErrorInfo.

В настоящее время это условие внутри вас посмотреть модель индексатор не будет хит:

if (columnName == "Name") 
{ 
... 
} 

потому что индексатор никогда не вызывается.


Мое предложение

Добавить Name свойство вашей модели представления, которая будет представлять имя клиентов. Вы можете инициализировать модель представления с классом клиента, как установка

Name = customer.Name 

в конструкторе вид моделей.

привязки, необходимо будет изменить, чтобы

<TextBox Text="{Binding Name .... 

После этого, индексатор должен работать, потому что теперь есть Name свойство в модели представления.

Возможно, есть еще одно решение, которое позволит вам сохранить текущую привязанную привязку (Customer.Name), но я не знаю этого точно.

+0

Довольно точно, что это ситуация, когда у клиента нет INotifyDataErrorInfo/IDataErrorInfo унаследованного, обработка ошибок не пузырится. Если вы идете на модельный маршрут поверх маршрута viewmodel, дважды ожидайте код. Соглашение, встроенное в ConventionManager, явно ищет интерфейс INotifyDataErrorInfo/IDataErrorInfo и привязывает ValidatesOnError и NotifyOnValidationErrors к true. Выполнение проверки со свойствами в viewmodel, а затем присвоение результатов объекту, о котором идет речь, проще. – mvermef

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