Custom ValidationRules внутри Expander.Header Binding не срабатывает

У меня возникли проблемы с запуском пользовательского правила ValidationRule, когда оно связано с привязкой Expander.Header. На самом деле, единственное место, где я могу заставить эти пользовательские правила запускаться, - это блок DataGrid.RowValidationRules...

Расширитель определен в моем файле Window XAML следующим образом;

<Expander Style="{StaticResource ValidatedSecondLevelExpanderStyle}">
    <Expander.Header>
        <Binding Path="Name" Mode="OneWay" ValidatesOnDataErrors="True" NotifyOnValidationError="True">
            <Binding.ValidationRules>
                <ValidationRules:BoundObjectIsValid />
            </Binding.ValidationRules>
        </Binding>
    </Expander.Header>
</Expander>

Связанное свойство Name отображается правильно, но правило проверки BoundObjectIsValid не вызывается. Возможно ли это, и если да, то что я упускаю?

Я знаю, что я мог бы альтернативно реализовать IDataErrorInfo для связанного объекта, однако объект не может разумно проверить себя без некоторого контекста, предоставляемого другими частями системы. Рефакторинг возможен, но я хотел бы сначала заставить работать ValidationRules!


person RJ Lohan    schedule 05.12.2012    source источник


Ответы (1)


См. msdn.

Механизм привязки проверяет каждое правило ValidationRule, связанное с привязкой, каждый раз, когда он передает входное значение, которое является значением целевого свойства привязки, в свойство источника привязки.

Итак, здесь, в вашем случае, у вас нет входного значения, передаваемого в исходное свойство, поскольку ваш Expander.header не является элементом управления, который вы можете использовать для ввода значений.

Редактировать: Но в ValidationRule есть свойство с именем ValidatesOnTargetUpdated. При установке значения true правило проверки будет применяться при обновлении целевого свойства.

person Colin    schedule 06.12.2012
comment
Я получил DataGrid для проверки строк, когда они отображаются, а не изменены пользователем. Я предполагаю, что есть способ сделать это с любой привязкой, поскольку это доступная настройка...? - person RJ Lohan; 06.12.2012
comment
@RJLohan Вы можете попробовать установить для свойства «ValidatesOnTargetUpdated» ValidationRule значение true. Я только что узнал, что есть такое свойство. Надеюсь, это поможет. - person Colin; 06.12.2012
comment
Похоже, это свойство имеет значение, но не знаю почему, поскольку в другом случае оно не применяется. - person RJ Lohan; 06.12.2012