在另一个控件上显示错误验证
Display error validation on another control
我有一个 TextBlock
和一个 CheckBox
,因此:
<StackPanel >
<TextBlock Text="Colors"/>
<CheckBox Content="Blue" IsChecked="{Binding Model.Blue, ValidatesOnNotifyDataErrors=False}"/>
</StackPanel>
在我的模型中,我正在实施 INotifyDataErrorInfo
并验证复选框是否被选中。如果未选中,我将其视为错误:
public class MyModel : INotifyPropertyChanged, INotifyDataErrorInfo
{
[CustomValidation(typeof(MyModel), "CheckBoxRequired")]
public bool Blue
{
get { return _blue; }
set { _blue = value; RaisePropertyChanged(nameof(Blue)); }
}
public static ValidationResult CheckBoxRequired(object obj, ValidationContext context)
{
var model = (MyModel)context.ObjectInstance;
if (model.Blue == false)
return new ValidationResult("Blue required", new string[] { "Blue" });
else
return ValidationResult.Success;
}
//...
//INotifyPropertyChanged & INotifyDataErrorInfo implementations omitted
}
当我将 ValidatesOnNotifyDataErrors
设置为 true
时,它会正确地在 CheckBox
周围显示一个红框。它看起来像这样:
我不希望出现红色复选框。为此,我明确地将 ValidatesOnNotifyDataErrors
设置为 false
。这很好用。
出现错误时我想做的是在TextBlock
上显示错误,比如改变TextBlock
的字体颜色。 TextBlock
如何知道 CheckBox
上出现的任何错误,最好的处理方法是什么?
我的预期结果是这样的:
首先设置ValidatesOnNotifyDataErrors
不是消除红色边框的正确方法。这将导致您的数据根本无法验证。你要的是这个:
<CheckBox Content="Blue" IsChecked="{Binding Model.Blue, ValidatesOnNotifyDataErrors=True}" Validation.ErrorTemplate="{x:Null}"/>
其次,为了得到想要的结果,我会使用 this 种方法。您可以使用触发器来了解 CheckBox 中是否存在错误(ErrorsChanged
事件和 HasError
属性 在这里应该很有用)并设置 TextControl 的文本颜色。
这里是实现这个的代码:
<TextBlock Text="Color">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=checkBox, Path=(Validation.HasError)}" Value="True">
<Setter Property="Foreground" Value="Red" />
<Setter Property="ToolTip" Value="{Binding ElementName=checkBox, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<CheckBox x:Name="checkBox"
Margin="4,0"
Content="Blue"
IsChecked="{Binding Model.Blue}"
Validation.ErrorTemplate="{x:Null}" />
根据 Karina K 的见解,我使用了以下代码来达到预期的结果:
<TextBlock Text="Color">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=checkBox, Path=(Validation.HasError)}" Value="True">
<Setter Property="Foreground" Value="Red" />
<Setter Property="ToolTip" Value="{Binding ElementName=checkBox, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<CheckBox x:Name="checkBox"
Margin="4,0"
Content="Blue"
IsChecked="{Binding Model.Blue}"
Validation.ErrorTemplate="{x:Null}" />
我有一个 TextBlock
和一个 CheckBox
,因此:
<StackPanel >
<TextBlock Text="Colors"/>
<CheckBox Content="Blue" IsChecked="{Binding Model.Blue, ValidatesOnNotifyDataErrors=False}"/>
</StackPanel>
在我的模型中,我正在实施 INotifyDataErrorInfo
并验证复选框是否被选中。如果未选中,我将其视为错误:
public class MyModel : INotifyPropertyChanged, INotifyDataErrorInfo
{
[CustomValidation(typeof(MyModel), "CheckBoxRequired")]
public bool Blue
{
get { return _blue; }
set { _blue = value; RaisePropertyChanged(nameof(Blue)); }
}
public static ValidationResult CheckBoxRequired(object obj, ValidationContext context)
{
var model = (MyModel)context.ObjectInstance;
if (model.Blue == false)
return new ValidationResult("Blue required", new string[] { "Blue" });
else
return ValidationResult.Success;
}
//...
//INotifyPropertyChanged & INotifyDataErrorInfo implementations omitted
}
当我将 ValidatesOnNotifyDataErrors
设置为 true
时,它会正确地在 CheckBox
周围显示一个红框。它看起来像这样:
我不希望出现红色复选框。为此,我明确地将 ValidatesOnNotifyDataErrors
设置为 false
。这很好用。
出现错误时我想做的是在TextBlock
上显示错误,比如改变TextBlock
的字体颜色。 TextBlock
如何知道 CheckBox
上出现的任何错误,最好的处理方法是什么?
我的预期结果是这样的:
首先设置ValidatesOnNotifyDataErrors
不是消除红色边框的正确方法。这将导致您的数据根本无法验证。你要的是这个:
<CheckBox Content="Blue" IsChecked="{Binding Model.Blue, ValidatesOnNotifyDataErrors=True}" Validation.ErrorTemplate="{x:Null}"/>
其次,为了得到想要的结果,我会使用 this 种方法。您可以使用触发器来了解 CheckBox 中是否存在错误(ErrorsChanged
事件和 HasError
属性 在这里应该很有用)并设置 TextControl 的文本颜色。
这里是实现这个的代码:
<TextBlock Text="Color">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=checkBox, Path=(Validation.HasError)}" Value="True">
<Setter Property="Foreground" Value="Red" />
<Setter Property="ToolTip" Value="{Binding ElementName=checkBox, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<CheckBox x:Name="checkBox"
Margin="4,0"
Content="Blue"
IsChecked="{Binding Model.Blue}"
Validation.ErrorTemplate="{x:Null}" />
根据 Karina K 的见解,我使用了以下代码来达到预期的结果:
<TextBlock Text="Color">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=checkBox, Path=(Validation.HasError)}" Value="True">
<Setter Property="Foreground" Value="Red" />
<Setter Property="ToolTip" Value="{Binding ElementName=checkBox, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<CheckBox x:Name="checkBox"
Margin="4,0"
Content="Blue"
IsChecked="{Binding Model.Blue}"
Validation.ErrorTemplate="{x:Null}" />