我已经修改了基于TextBoxBase的控件的默认Validation.ErrorTemplate。 所以我有工具提示和标签弹出,在输入字段获得焦点时显示错误。
当控件没有文本但需要输入时,我想删除默认的红色边框,并用控件左侧的星号*替换红色边框。
我认为如果你有很多必填字段,那么使用填充了可怕红色框的表格就会遇到这种情况。只有在输入无效值时才会显示红色边框,例如年龄等于223。
所以我想我想根据触发器切换模板或部分模板。
答案 0 :(得分:0)
恕我直言,你不能在TextBox控件上使用StyleSelector。这是我的错。相反,您可以使用简单的转换器来切换TextBox样式。
以下是示例代码:
<强>型号:强>
public class User : ModelBase
{
private string _login;
[Required(ErrorMessage = "Login can not be empty")]
[MaxLength(20, ErrorMessage = "Login max lenght is 20")]
public string Login
{
get
{
return _login;
}
set
{
_login = value;
OnPropertyChanged("Login");
}
}
}
使用App.xaml中的自定义错误模板创建TextBox样式。
<强>的App.xaml 强>
<Application.Resources>
<Style x:Key="AsteriskErrorStyle"
TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<StackPanel Orientation="Horizontal">
<AdornedElementPlaceholder x:Name="AdornedElementPlaceholder" />
<TextBlock Foreground="Red"
Margin="10,0,0,0"
VerticalAlignment="Top"
FontSize="20"
Text="*"
ToolTip="{Binding ElementName=AdornedElementPlaceholder, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
</TextBlock>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="RedBorderErrorStyle"
TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Border BorderThickness="1.5"
BorderBrush="Red">
<AdornedElementPlaceholder x:Name="AdornedElementPlaceholder" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Application.Resources>
<强>转换器:强>
public class TextBoxStyleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string textBoxTex = value.ToString();
var asteriskErrorStyle = Application.Current.FindResource("AsteriskErrorStyle") as Style;
var redBorderErrorStyle = Application.Current.FindResource("RedBorderErrorStyle") as Style;
if (string.IsNullOrEmpty(textBoxTex))
{
return asteriskErrorStyle;
}
else
{
return redBorderErrorStyle;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
<强>用途:强>
<Window.Resources>
<styleSelector:TextBoxStyleConverter x:Key="TextBoxStyleConverter"/>
</Window.Resources>
<TextBox Grid.Column="1"
Grid.Row="0"
Margin="5,5,80,5"
Style="{Binding RelativeSource={RelativeSource Self}, Path=Text,Converter={StaticResource TextBoxStyleConverter}}"
Text="{Binding Path=User.Login, ValidatesOnNotifyDataErrors=True}" >
您可以下载here。
的示例项目答案 1 :(得分:0)
您可以将Binding.ValidatesOnExceptions
和Binding.ValidatesOnDataErrors
属性设置为False
,以停止显示默认的红色Border
。您可以使用Validation.ErrorTemplate
属性来应用星号,就像您似乎已经发现的那样:
<ControlTemplate x:Key="RedAsteriskValidationTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="*" Foreground="Red" FontWeight="Bold" Margin="0,0,5,0" />
<AdornedElementPlaceholder />
</StackPanel>
</ControlTemplate>
您可以在MSDN的Validation.ErrorTemplate
property页面上找到更多示例,包括使用Trigger
的示例。