Как заставить WPF повторно проверять элементы управления? - PullRequest
1 голос
/ 24 марта 2011

У меня есть экран с бизнес-правилами, в котором некоторые поля отображаются на основе бизнес-данных, а другие нет. Затем я играю с видимостью, чтобы показать / скрыть их.

Мой бизнес-объект реализует IDataErrorInfo.

Проблема, с которой я столкнулся, заключается в том, что некоторые проверки имеют место только при отображении поля.

В этом фрагменте кода первый IF выполняет проверку, только если type_account равен INTERNAL

string ValidateMinimumAmount()
{

    if (this.type_account != "INTERNAL")
       return null;

    if (this.account_minimum==null)
    {
        return "You must provide a minimum amount";
    }
    return null;
}

Проблема, с которой я столкнулся, заключается в том, что, поскольку исходное состояние моего BO НЕ "Внутреннее", то ДАЖЕ, если после того, как пользователь выберет "ВНУТРЕННЕЕ", проверка больше не будет выполняться.

Как я могу "заставить" проверку происходить ПОСЛЕ первого раза. Конечно, я проверил, что если начальное состояние «Внутреннее», то оно работает

Ответы [ 3 ]

1 голос
/ 24 марта 2011

Вы говорите, что ваша «проверка» исчезает, когда вы играете в прятки?но ваш объект с реализацией IDataErrorInfo по-прежнему недействителен после повторного показа?

, тогда, похоже, это просто проблема Adorner ValidationErrorTemplate.Я не знаю, как выглядит ваш xaml, но окружите ваш контейнер вашими элементами управления для проверки с помощью AdornerDecorator

<AdornerDecorator>
  <Yourcontainer with your Controls inside/>
</AdornerDecorator>

, если этот трюк не решит вашу проблему, опубликуйте привязку xaml и реализацию idataerrorinfo.

1 голос
/ 24 марта 2011

Я бы посоветовал вам более "правильно" уведомлять об ошибках, добавляя свойство ошибки.

Вот очень понятная статья, которая помогла мне, когда я только начинал работать в WPF как начинающий, выследует взглянуть на это:

http://www.codeproject.com/KB/WPF/wpfvalidation.aspx

0 голосов
/ 24 марта 2011

Ваш вопрос немного сбивает с толку.Надеюсь, этот ответ поможет.

В вашем примере вы хотите, чтобы минимальная сумма была обязательной, если тип учетной записи является внутренним.Это означает, что состояние проверки свойства MinimumAmount зависит от значения AccountType.Таким образом, вы должны проверять MinimumAmount всякий раз, когда AccountType изменяется.Таким образом:

public string AccountType
{
   get { return _AccountType; }
   set
   {
      if (_AccountType != value)
      {
         _AccountType = value;
         OnPropertyChanged("AccountType");
         ValidateMinimumAmount();
      }
   }
}

Если у вас много взаимозависимостей между свойствами, иногда проще всего реализовать метод Validate() для всего объекта и вызывать его всякий раз, когда изменяется любое свойство.Не зацикливайтесь на идее, что неэффективно повторно проверять весь объект каждый раз, когда свойство изменяется.Свойства представления модели обычно изменяются только в ответ на пользовательский ввод, и если ваш метод Validate() занимает значительное время для запуска, шансы очень малы, что это когда-либо будет проблемой.

...