C# IDateErrorInfo Multi Validation.ErrorTemplate
我已将C# IDateErrorInfo Multi Validation.ErrorTemplate,c#,wpf,validation,mvvm,idataerrorinfo,C#,Wpf,Validation,Mvvm,Idataerrorinfo,我已将IDataErrorInfo实现到我的自定义控件ViewModels。一切都正常(边框被画成红色,带有错误的工具提示被显示),但我想知道是否有一种方法可以让两个不同的验证.ErrorTemplates用于错误和警告 我的自定义控件样式(带有Validation.ErrorTemplate) 我的自定义控件ViewModel(INotifyPropertyChanged在基础ViewModel上实现) 公共类CustomTextBoxNumericViewModel:BaseCompon
IDataErrorInfo
实现到我的自定义控件ViewModel
s。一切都正常(边框被画成红色,带有错误的工具提示被显示),但我想知道是否有一种方法可以让两个不同的验证.ErrorTemplate
s用于错误和警告
我的自定义控件样式(带有Validation.ErrorTemplate)
我的自定义控件ViewModel(INotifyPropertyChanged在基础ViewModel上实现)
公共类CustomTextBoxNumericViewModel:BaseComponentViewModel,IDataErrorInfo
{
私有十进制?小数值;
私人布尔错误;
私人布尔警告;
公共CustomTextBoxNumericViewModel()
{
}
[数据成员(EmitDefaultValue=false)]
公共十进制?十进制值
{
获取{返回this.decimalValue;}
设置{this.decimalValue=value;this.Changed(“decimalValue”);this.Changed(“HasErrors”);}
}
[数据成员(EmitDefaultValue=false)]
公共布尔错误
{
获取{返回this.hasErrors;}
设置{this.hasrerrors=value;this.Changed(“hasrerrors”);this.Changed(“DecimalValue”);}
}
[数据成员(EmitDefaultValue=false)]
公共布尔警告
{
获取{返回this.hasWarnings;}
设置{this.hasWarnings=value;this.Changed(“hasWarnings”);this.Changed(“DecimalValue”);}
}
#区域IDataErrorInfo实现
公共字符串错误
{
得到
{
抛出新的NotImplementedException();
}
}
公共字符串此[string propertyName]
{
得到
{
如果(propertyName==“小数值”)
{
如果(有错误)
{
返回此.ErrorsField;
}
如果(警告)
{
返回此.WarningsField;
}
if(小数值<0)
{
返回“必须大于0”;
}
}
返回字符串。空;
}
}
#端区
}
我使用
ControlTemplate
资源解决了我的问题
我的风格改为:
<Style TargetType="{x:Type controls:CustomTextBoxNumeric}">
<Setter Property="TextAlignment" Value="Right"/>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<Border BorderBrush="Red" BorderThickness="1">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
</Trigger>
<DataTrigger Binding="{Binding Path=ViewModel.HasWarnings, RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="Validation.ErrorTemplate" Value="{DynamicResource EntypoWarningTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=ViewModel.HasErrors, RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="Validation.ErrorTemplate" Value="{DynamicResource EntypoErrorTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
您可以通过使用Style.Triggers来访问它
public class CustomTextBoxNumericViewModel : BaseComponentViewModel, IDataErrorInfo
{
private decimal? decimalValue;
private bool hasErrors;
private bool hasWarnings;
public CustomTextBoxNumericViewModel()
{
}
[DataMember(EmitDefaultValue = false)]
public decimal? DecimalValue
{
get { return this.decimalValue; }
set { this.decimalValue = value; this.Changed("DecimalValue"); this.Changed("HasErrors"); }
}
[DataMember(EmitDefaultValue = false)]
public bool HasErrors
{
get { return this.hasErrors; }
set { this.hasErrors = value; this.Changed("HasErrors"); this.Changed("DecimalValue"); }
}
[DataMember(EmitDefaultValue = false)]
public bool HasWarnings
{
get { return this.hasWarnings; }
set { this.hasWarnings = value; this.Changed("HasWarnings"); this.Changed("DecimalValue"); }
}
#region IDataErrorInfo Implementation
public string Error
{
get
{
throw new NotImplementedException();
}
}
public string this[string propertyName]
{
get
{
if (propertyName == "DecimalValue")
{
if (HasErrors)
{
return this.ErrorsField;
}
if (HasWarnings)
{
return this.WarningsField;
}
if (DecimalValue < 0)
{
return "Must be greater than 0";
}
}
return string.Empty;
}
}
#endregion
}
<Style TargetType="{x:Type controls:CustomTextBoxNumeric}">
<Setter Property="TextAlignment" Value="Right"/>
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<Border BorderBrush="Red" BorderThickness="1">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
</Trigger>
<DataTrigger Binding="{Binding Path=ViewModel.HasWarnings, RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="Validation.ErrorTemplate" Value="{DynamicResource EntypoWarningTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=ViewModel.HasErrors, RelativeSource={RelativeSource Self}}" Value="True">
<Setter Property="Validation.ErrorTemplate" Value="{DynamicResource EntypoErrorTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
<ControlTemplate x:Key="MyErrorTemplate" TargetType="{x:Type Control}">
<DockPanel LastChildFill="True">
<Border BorderBrush="Red" BorderThickness="1">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>
<ControlTemplate x:Key="MyWarningTemplate" TargetType="{x:Type Control}">
<DockPanel LastChildFill="True">
<Border BorderBrush="Orange" BorderThickness="1">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>