Проверка на основе исключений WPF, начальное состояние не вызывается - PullRequest
1 голос
/ 25 июня 2010

(я знаю, что есть несколько близких дубликатов, но никто из них не смог мне помочь, пожалуйста, выслушайте меня)

У меня есть установщики моей модели, которые выдают соответствующие исключения, когда что-то пытается установить недопустимое значение. Это творит чудеса, когда пользователь вводит новое значение.

Однако, когда я создаю новый объект модели, начальное состояние может быть недопустимым (нет значения в описании и т. Д.). Это, конечно, не будет проверено, но без каких-либо попыток установить значение не будет выдано исключение для ExceptionValidationRule, чтобы поймать.

Простые решения, которые у меня есть:

  1. Поймать изменение в текущем объекте, запустить оценку типа Current.Value = Current.Value, чтобы заставить часть .set_Value выполнить и повторно проверить (таким образом, запуск ExceptionValidationRule обновит состояние. Однако это грязно и неправильно

  2. Поймать изменение в объекте и вызвать ручную проверку свойств по свойствам и каким-то образом обновить HasError и Validation.Errors, что приведет к тому, что объект обновит свое визуальное состояние. Это больше похоже на взлом, чем на что-либо, и я не уверен, как это сделать

Теперь самая большая проблема в том, что я мог бы подключить что-то, что сработало бы в любой из этих ситуаций. Но они полностью нарушили бы мою структуру MVVM, я не имею ни малейшего понятия, как внедрить этот вид проверки прямо в MVVM.

  • Я смотрел на создание своего собственного типа переплета, без игры в кости.
  • Я смотрел на создание декоратора для захвата моих детей, может сработать: нужна дополнительная информация
  • Я смотрел на IDataError реализации, для меня это не сработает, так как требует использования индексатора this[string], который будет конфликтовать с реализациями моего существующего объекта модели.

Так что у меня нет идей, и я обращаюсь к you SO, для некоторого понимания того, как решить эту проблему.

Ответы [ 2 ]

2 голосов
/ 25 июня 2010

Если ваша модель может быть в недопустимом состоянии, то реализация в ней IDataErrorInfo представляется наиболее подходящим решением.Проблема с IDataErrorInfo в том, что у вас уже есть индексатор в вашей модели, который принимает строковый параметр?Вы можете использовать явную реализацию интерфейса для реализации IDataErrorInfo отдельно от вашего общедоступного индексатора:

public class Model
    : IDataErrorInfo
{
    public string this[string parameter]
    {
        get { /* Your current indexer */ }
    }

    string IDataErrorInfo.this[string columnName]
    {
        get { /* IDataErrorInfo indexer implementation */ }
    }

    /* ... */
}

Если вы вообще не можете изменить свою модель, то вы можете сделатьКласс ViewModel, который упаковывает модель и реализует IDataErrorInfo.

1 голос
/ 26 июня 2010

Я согласен с Quartermeister, что интерфейс IDataErrorInfo может быть лучшим вариантом. Если вы не можете реализовать индексатор this [string] , вы все равно можете реализовать интерфейс с явными членами.

string IDataErrorInfo.this[string memberName] 
{ 
    get { return ... } 
}

Возможно, вы посмотрите на BookLibrary пример приложения WPF Application Framework (WAF) , который показывает, как интерфейс IDataErrorInfo может использоваться вместе с MVVM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...