Проверка Silverlight зависимых элементов управления? - PullRequest
1 голос
/ 19 декабря 2009

У меня есть приложение Silverlight 3 с двумя датчиками для даты начала и окончания. Это данные, привязанные к бизнес-объекту, который реализует логику проверки так, что StartDate должен быть до EndDate, а EndDate должен быть после StartDate.

Пока все хорошо - оба элемента управления отображают соответствующую ошибку проверки, когда в соответствующем установщике возникает исключение проверки.

Моя проблема в том, что если пользователь изменяет «другой» элемент управления так, что «недопустимая» дата в первом элементе управления теперь действительна, состояние первого элемента управления не изменяется (поскольку его установщик не был вызван).

Например, если я установил StartDate на 15 декабря 2009 года, а EndDate на 10 декабря 2009 года, элемент управления EndDate правильно перейдет в недопустимое состояние. Если пользователь изменяет StartDate на 9 декабря 2009 года, элемент управления EndDate по-прежнему помечается как недействительный, поскольку пользовательский интерфейс не вызвал установщик EndDate.

Существует ли «чистый» метод MVVM-стиля для принудительного повторного подтверждения пользовательского интерфейса?

1 Ответ

1 голос
/ 24 декабря 2009

используйте класс ValidationScope от здесь По сути, это позволяет группировать несколько элементов управления и проверять эту группу при запуске определенной команды, хорошо работает для стандартных вещей.

Xaml для нескольких текстовых полей

<StackPanel local:ValidationScope.ValidationScope="{Binding PersonValidationScope}">
        <TextBox
            Text="{Binding Person.Name, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"
            local:ValidationScope.ValidateBoundProperty="Text" />
        <TextBox
            Text="{Binding Person.Age, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"
            local:ValidationScope.ValidateBoundProperty="Text" />
        <ComboBox
            ItemsSource="{Binding Salutations}"     
         SelectedItem="{Binding Person.Salutation, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}"
    local:ValidationScope.ValidateBoundProperty="SelectedItem" />
    <Button Content="Save" Click="SaveButtonClick" />
</StackPanel>

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

public void Save()
{
    // This causes all registered bindings to be updated
    PersonValidationScope.ValidateScope();
    if (PersonValidationScope.IsValid())
    {
        // Save changes!
    }
}

Перейдите по ссылке для класса ValidationScope.

...