Проверка экспандера WPF - PullRequest
2 голосов
/ 08 февраля 2011

Кто-нибудь знает способ изменить стиль экспандера, если в элементе управления, содержащемся в экспандере, происходит проверка IDataError. Э.Г.

<Expander Header="Details">
    <TextBox Text="{Binding Brand.DESCRIPTION,
                            UpdateSourceTrigger=LostFocus,
                            ValidatesOnDataErrors=True}"/>
</Expander>

Так что, если в текстовом поле есть ошибка, стиль моего экспандера изменится (возможно, станет красным). Я стремлюсь сделать это как можно более универсальным, чтобы, по возможности, без привязки к каждому элементу управления в расширителе вручную.

1 Ответ

2 голосов
/ 08 февраля 2011

Вы можете использовать прикрепленное событие Validation.Error (которое возникает при каждом добавлении или удалении ошибки проверки) через присоединенное поведение. Для этого вам нужно добавить NotifyOnValidationError=True к привязкам.

Это присоединенное поведение, ChildValidation, подписывается на событие Validation.Error для Expander, которое всплывает, если для NotifyOnValidationError установлено значение True в привязках. Поскольку несколько Control могут быть расположены в пределах Expander, необходимо также отслеживать количество ошибок проверки, которые в настоящее время активны, чтобы определить, должна ли отображаться красная граница или нет. Это может выглядеть так

Xaml

<Expander Header="Details"
            behaviors:ChildValidationBehavior.ChildValidation="True">
    <TextBox Text="{Binding Brand.DESCRIPTION,
                            UpdateSourceTrigger=LostFocus,
                            ValidatesOnDataErrors=True,
                            NotifyOnValidationError=True}"/>
</Expander>

Поведение ребенка Поведение

public static class ChildValidationBehavior 
{
    private static readonly DependencyProperty ErrorCountProperty =
        DependencyProperty.RegisterAttached("ErrorCount",
                                            typeof(int),
                                            typeof(ChildValidationBehavior));
    private static void SetErrorCount(DependencyObject element, int value)
    {
        element.SetValue(ErrorCountProperty, value);
    }
    private static int GetErrorCount(DependencyObject element)
    {
        return (int)element.GetValue(ErrorCountProperty);
    }

    public static readonly DependencyProperty ChildValidationProperty = 
        DependencyProperty.RegisterAttached("ChildValidation", 
                                            typeof(bool),
                                            typeof(ChildValidationBehavior),
                                            new UIPropertyMetadata(false, OnChildValidationPropertyChanged));
    public static bool GetChildValidation(DependencyObject obj) 
    {
        return (bool)obj.GetValue(ChildValidationProperty); 
    }
    public static void SetChildValidation(DependencyObject obj, bool value) 
    {
        obj.SetValue(ChildValidationProperty, value); 
    }
    private static void OnChildValidationPropertyChanged(DependencyObject dpo, 
                                                         DependencyPropertyChangedEventArgs e)
    {
        Control control = dpo as Control;
        if (control != null)
        { 
            if ((bool)e.NewValue == true) 
            {
                SetErrorCount(control, 0);
                Validation.AddErrorHandler(control, Validation_Error);
            } 
            else 
            {
                Validation.RemoveErrorHandler(control, Validation_Error);
            } 
        } 
    }
    private static void Validation_Error(object sender, ValidationErrorEventArgs e)
    {
        Control control = sender as Control;
        if (e.Action == ValidationErrorEventAction.Added)
        {
            SetErrorCount(control, GetErrorCount(control)+1);
        }
        else
        {
            SetErrorCount(control, GetErrorCount(control)-1);
        }
        int errorCount = GetErrorCount(control);
        if (errorCount > 0)
        {
            control.BorderBrush = Brushes.Red;
        }
        else
        {
            control.ClearValue(Control.BorderBrushProperty);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...