Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF扩展器验证_C#_Wpf_Validation_Xaml - Fatal编程技术网

C# WPF扩展器验证

C# WPF扩展器验证,c#,wpf,validation,xaml,C#,Wpf,Validation,Xaml,如果扩展程序中的控件发生IDataError验证,是否有人知道如何更改扩展程序的样式。例如 <Expander Header="Details"> <TextBox Text="{Binding Brand.DESCRIPTION, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=True}"/>

如果扩展程序中的控件发生IDataError验证,是否有人知道如何更改扩展程序的样式。例如

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

因此,如果文本框出现错误,我的扩展器的样式将改变(可能变为红色)。
我希望尽可能使其通用化,以便尽可能不手动绑定到扩展器中的每个控件。

您可以通过附加的行为使用附加的事件
验证。错误
(每次添加或删除验证错误时都会引发)。要实现这一点,您需要向绑定中添加
NotifyOnValidationError=True

此附加行为,
ChildValidation
,订阅了
扩展器的
Validation.Error
事件,如果绑定上的
NotifyOnValidationError
设置为True,则会弹出该事件。由于多个
控件
可能位于
扩展器
内,因此它还需要跟踪当前活动的验证错误计数,以确定是否应显示红色边框。它可能看起来像这样

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);
        }
    }
}

听起来像是自定义类!自定义扩展器,自定义内部控件,内部控件触发IDataError事件,扩展器订阅这些事件,并相应地处理。太棒了。我可以看到正在调用Validation_错误,但是扩展器没有更新。我有一个适用于所有扩展器的样式,这可能是原因吗?无论如何,我找到了一个替代方案。修改了Validation_错误,将控件强制转换为扩展器,并更新前景(文本颜色)并打开扩展器。谢谢你的帮助。我试图用它将标题颜色改为红色。当我这样做(control.foreground=brushs.Red)时,它会将扩展器下的所有子项的标题也变成红色,在我的例子中,这些标题是GroupBox。有没有办法只改变扩展器的前景而不是它的内容?