Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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# IDateErrorInfo Multi Validation.ErrorTemplate_C#_Wpf_Validation_Mvvm_Idataerrorinfo - Fatal编程技术网

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>