WPF длительный сценарий проверки - PullRequest
0 голосов
/ 03 августа 2010
  • в моем сценарии у меня есть сервер данных Linq2SQL.
  • мои Dataobjects реализуют IDataErrorInfo для перехвата ошибок, подобных Name==null (быстрое выполнение правил Validation, которые требуют только значения, пока ничего особенного)

  • Объекты данных организованы в виде древовидной структуры, поэтому у каждого есть Родитель и Дочерние элементы

Как я могу проверить, является ли выбранное имя уникальным для потомков родителя объекта данных?

Проблема, с которой я сталкиваюсь, заключается в том, что для проверки уникального имени требуется обратная поездка в базу данных, в которой задержка при наборе текста UpdateSourceTrigger="PropertyChanged" связана с привязкой TextBox к имени.

С другой стороны, я мог бы установить UpdateSourceTrigger="LostFocus", но проблема в том, что я включаю / отключаю кнопку «Сохранить» для действительных / недействительных данных. Теперь в недопустимом состоянии вы не можете нажать кнопку «Сохранить», поэтому текстовое поле не может потерять фокус для обновления (только вкладки, что некрасиво, но в LostFocus больше «непригодностей» (например, ошибка отображается во время ввода и таким образом меняя название).

что было бы идеально, если бы можно было сказать, как отдельные правила валидации применяются к различным событиям, например:

<TextBox Grid.Column="1">
    <TextBox.Text>
        <Binding Path="Foldername">
            <Binding.ValidationRules>
                <wpfresources:UniqueChildValidationRule ValidationStep="UpdatedValue" **UpdateSourceTrigger="LostFocus"**>
                    ... stuff here ...
                </wpfresources:UniqueChildValidationRule>
                <DataErrorValidationRule **UpdateSourceTrigger="PropertyChanged"**/>
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

Каков наилучший способ решить эту проблему?

EDIT

Эта статья MSDN , по-видимому, предполагает, что BindingGroup будет правильным выбором. Я посмотрю на это ...

Ответы [ 2 ]

1 голос
/ 06 августа 2010

Я наконец-то нашел способ выполнить то, что хотел.

Использование BindingGroup сработало, но я урезал свое решение, потому что по сути мне был нужен способ показать Validationerror в правильном Textbox.

Теперь я сделал это с прикрепленным свойством, которое я прочитал при выполнении функции "save". затем я вручную проверяю и устанавливаю ValidationError для текстового поля. таким образом, текстовое поле может сохранять свой PropertyChanged UpdateSourceTrigger, и длительная проверка выполняется при отправке.

0 голосов
/ 03 августа 2010

Для чего бы то ни было, проверка, которая требует потенциально произвольного времени (например, общение с базой данных по сети), является одной из форм проверки, которую не нужно отражать в пользовательском интерфейсе в реальном времени. Если вы можете работать так, чтобы это было (предварительно кэшируя значения, которые будут проверены путем чтения их из БД, прежде чем они понадобятся, например), тем лучше, но это единственный сценарий, когда сообщение об ошибке после Пользователь предоставил данные, как правило, приемлемо, если вы не уничтожите введенную пользователем информацию.

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