Проверка между несколькими полями на разных уровнях - PullRequest
5 голосов
/ 06 декабря 2011

У меня проблема с проверками между несколькими полями. Например, я получил ViewModel с именем RangeDateViewModel, который содержит 2 экземпляра класса с именем DateViewModel, каждый из которых представляет дату начала и дату окончания соответственно.

Так что мой переплет выглядит так -

<TextBox Text="{Binding StartDate.Date, ValidateOnDataError=True}">
<TextBox Text="{Binding EndDate.Date, ValidateOnDataError=True}">

Мой класс RangeDateViewModel реализует интерфейс IDataErrorInfo. В моем плане RangeDateViewModel будет проверять, что дата начала предшествует дате окончания, применяя логику проверки в функции IDataErrorInfo ["propertyName"], например, так: *

    public string this[string columnName]
    {
         get
         {
            return ValidationError();
         }
     }

Проблема в том, что это никогда не вызывается, и вместо этого вызываются свойства IDataErrorInfo, которые находятся в каждом из классов DateViewModel.

Полагаю, это связано с тем, что связанное свойство находится не на том же уровне RangeDateViewModel, а внутри дочернего DateViewModel.

Я думаю, что моя потребность достаточно проста, и для этой проблемы должно быть простое решение. Я пытался использовать ValidationRules вместо IDataErrorInfo, но тогда у меня возникли проблемы с сообщением ViewModel о текущем состоянии проверки из ValidationRules.

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

У меня была проблема, что public string this[string columnName] просто не вызывали на прошлой неделе.

Решение было простым. Механизм привязки WPF привязки не может следовать вложенности моих ViewModels.

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

Пример:

<TextBox Text="{Binding Path=ProductViewModel.DescriptionViewModel.ProductName,
                                    Mode=TwoWay,
                                    ValidatesOnDataErrors=True,
                                    NotifyOnValidationError=True}" />

Здесь DescriptionViewModel - это класс, который содержит связанное свойство. IDataErrorInfo должен быть реализован в этом классе ( не в ProductViewModel или другой класс в иерархии, которая может его содержать), тогда все будет работать нормально.

1 голос
/ 06 декабря 2011

Попробуйте использовать следующий подход:

  1. Создать DataTemplate для DateViewModel:

    <DataTemplate DataType="{x:Type ViewModels:DateViewModel}">
        <TextBox Text="{Binding Date}">
    </DataTemplate>
    
  2. Привязать экземплярыthis ViewModel для ContentControl и установите ValidateOnDataError в true для этой привязки:

    <ContentControl Content="{Binding StartDate, ValidateOnDataError=True}" />
    <ContentControl Content="{Binding EndDate, ValidateOnDataError=True}" />
    
  3. В RangeDateViewModel подпишитесь на PropertyChanged событие StartDate и EndDate и, если он поднят, поднять событие PropertyChanged с StartDate / EndDate:

    StartDate.PropertyChanged += (s, e) => InvokePropertyChanged("StartDate");
    EndDate.PropertyChanged += (s, e) => InvokePropertyChanged("EndDate");
    
...