Проверка зависимых свойств в WPF и SL - PullRequest
1 голос
/ 05 мая 2011

Каков рекомендуемый подход для проверки двух свойств в зависимости друг от друга?

Классический пример: начало должно быть меньше конец дата:

  1. пользователь вводит старт"6-й"
  2. пользователь вводит end «3-е» - оба поля должны быть помечены как недействительные
  3. пользователь исправляет start до "1st" - оба поля должны быть в порядке

Как здесь может помочь ReactiveValidatedObject?

Мне предпочтительно нужно решение, которое работает в WPF и Silverlight.

1 Ответ

2 голосов
/ 26 мая 2011

Если вы используете шаблон MVVM для приложения WPF, это будет довольно просто.Вместо того, чтобы View делал проверку, ViewModel сделает это.Представление должно быть просто тупым слоем, отображающим все, что демонстрирует ViewModel.Вся проверка пользовательского интерфейса должна выполняться ViewModel, чтобы они были тестируемыми.

Моя ViewModel может выглядеть следующим образом:

class MyViewModel : INotifyPropertyChanged
{
    /* declare ProperChanged event and implement  OnPropertyChanged() method */

    private DateTime _firstDate;
    public DateTime FirstDate
    {
        get { return _firstDate; }
        set
        {
            if (!AreDatesValid(value, _secondDate))
            {
                ErrorMessage = "Incorrect First Date";
                return;
            }
            _firstDate = value;
            OnPropertyChanged("FirstDate");
        }
    }

    private DateTime _secondDate;
    public DateTime SecondDate
    {
        get { return _secondDate; }
        set
        {
            if (!AreDatesValid(_firstDate, value))
            {
                ErrorMessage = "Incorrect Second Date";
                return;
            }
            _secondDate = value;
            OnPropertyChanged("SecondDate");
        }
    }

    private string _errorMessage;
    public string ErrorMessage
    {
        get { return _errorMessage; }
        set
        {
            _errorMessage = value;
            OnPropertyChanged("ErrorMessage");
        }
    }

    private bool AreDatesValid(DateTime firstDate, DateTime secondDate)
    {
        if(firstDate <= secondDate )
            return true;
        return false;
    }
}

И затем привязка к данным View для этой ViewModel ->

        <DataTemplate DataType="{x:Type ViewModel:MyViewModel}">
           <Grid>
               <TextBox Text="{Binding Path=FirstDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
               <TextBox Text="{Binding Path=SecondDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
               <TextBlock Text="{Binding Path=ErrorMessage}" />
           </Grid>
        <DataTemplate>
...