首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IDateErrorInfo Multi Validation.ErrorTemplate

IDateErrorInfo Multi Validation.ErrorTemplate
EN

Stack Overflow用户
提问于 2016-03-04 11:45:55
回答 1查看 75关注 0票数 2

我已经在我的自定义控件的ViewModel上实现了ViewModel。一切都很好(边框被绘制成红色,带有错误的工具提示正在shawn),但是我想知道是否有一种方法可以有两个不同的Validation.ErrorTemplate来处理错误和警告。

我的自定义控件样式(使用Validation.ErrorTemplate)

代码语言:javascript
复制
        <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>
        </Style.Triggers>
    </Style>

My Control (INotifyPropertyChanged在基本ViewModel上实现)

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-04 15:36:16

我设法使用ControlTemplate资源解决了我的问题。

我的风格改变为:

代码语言:javascript
复制
<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>

The ControlTemplates

代码语言:javascript
复制
        <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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35795249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档