C# WPF扩展器验证
如果扩展程序中的控件发生IDataError验证,是否有人知道如何更改扩展程序的样式。例如C# WPF扩展器验证,c#,wpf,validation,xaml,C#,Wpf,Validation,Xaml,如果扩展程序中的控件发生IDataError验证,是否有人知道如何更改扩展程序的样式。例如 <Expander Header="Details"> <TextBox Text="{Binding Brand.DESCRIPTION, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=True}"/>
<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。有没有办法只改变扩展器的前景而不是它的内容?