首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于ErrorTemplate的不同的ErrorTemplate

用于ErrorTemplate的不同的ErrorTemplate
EN

Stack Overflow用户
提问于 2015-03-12 10:12:47
回答 1查看 41关注 0票数 0

在我的应用程序中,我有一个ControlTemplate,用于显示TextBox的输入无效。ControlTemplate被定义为:

代码语言:javascript
复制
<ControlTemplate x:Key="TextBoxErrorTemplate" TargetType="Control">
    <Grid ClipToBounds="False">
        <Border BorderBrush="Red" BorderThickness="1" Margin="-1">
            <AdornedElementPlaceholder Name="adornedElement" />
        </Border>
        <Image HorizontalAlignment="Right" VerticalAlignment="Top"
               Width="16" Height="16" Margin="0,-9,-8,0" Source="pack://application:,,,/UI.Resources;component/Graphics/Error_16_16.png"
               ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
    </Grid>
</ControlTemplate>

其用途是:

代码语言:javascript
复制
<TextBox Grid.Row="1" Margin="0,5"
         Text="{Binding UserGroup.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
         Validation.ErrorTemplate="{StaticResource TextBoxErrorTemplate}"/>

UserGroup类实现了IDataErrorInfo-Interface。班上有一小部分人看起来是这样的:

代码语言:javascript
复制
public class UserGroup
{
    public string Name
    {
        get { return Get(() => Name); }
        set { Set(() => Name, value); }
    }

    public bool IsDuplicate
    {
        get { return Get(() => IsDuplicate); }
        set { Set(() => IsDuplicate, value); }
    }

    public bool IsSimilar
    {
        get { return Get(() => IsSimilar); }
        set { Set(() => IsSimilar, value);}
    }
}

IDataErrorInfo所需的getter的实现如下所示:

代码语言:javascript
复制
public string this[string columnName]
{
    get
    {
        string result = string.Empty;
        string namePropertyName = GetPropertyNameFromExpression(() => Name);
        string isDuplicatePropertyName = GetPropertyNameFromExpression(() => IsDuplicate);
        string isSimilarPropertyName = GetPropertyNameFromExpression(() => IsSimilar);

        if (columnName == namePropertyName)
        {
            if(IsSimilar)
            {
                result = "Be careful with similar group-names!";
                if (!Error.Contains(isSimilarPropertyName))
                {
                    Error += isSimilarPropertyName;
                }
            }
            else
            {
                Error = Error.Replace(isSimilarPropertyName, string.Empty);
            }

            if (IsDuplicate)
            {
                result = "Duplicate names are not allowed!";
                if (!Error.Contains(isDuplicatePropertyName))
                {
                    Error += isDuplicatePropertyName;
                }
            }           
            else
            {
                Error = Error.Replace(isDuplicatePropertyName, string.Empty);
            }
        }       
        return result;
    }
}

因此,如果IsSimilarIsDuplicate为真,则将使用TextBoxErrorTemplate-ControlTemplate

我想要的是,只有当TextBoxErrorTemplate等于true时,才应该使用IsDuplicate

IsSimilar等于true的情况下,我想使用以下ControlTemplate

代码语言:javascript
复制
<ControlTemplate x:Key="TextBoxWarningTemplate" TargetType="Control">
    <Grid ClipToBounds="False">
        <Border BorderBrush="Orange" BorderThickness="1" Margin="-1">
            <AdornedElementPlaceholder Name="adornedElement" />
        </Border>
        <Image HorizontalAlignment="Right" VerticalAlignment="Top"
               Width="16" Height="16" Margin="0,-9,-8,0" Source="pack://application:,,,/UI.Resources;component/Graphics/Warning_16_16.png"
               ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
    </Grid>
</ControlTemplate>

有办法做到这一点吗?我的第一种方法是用一个TextBox覆盖Border,并且只显示IsSimilar是否是真的,但这看起来并不是很好……

我读过关于TemplateSelector的文章,但只在DataGridTemplateColumn的上下文中读过

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-12 14:31:57

我自己解决的。解决方案只有一个ControlTemplate,其中ImageSourceBorderBrush绑定到一个UserGroup属性,并在两个转换器中完成决策。

ControlTemplate看起来像:

代码语言:javascript
复制
 <ControlTemplate x:Key="TextBoxErrorTemplate" TargetType="Control">
    <Grid ClipToBounds="False">
        <Border BorderThickness="1" Margin="-1" 
                BorderBrush="{Binding DataContext.UserGroup, Converter={converters:UserGroupToBrushConverter}, 
                              RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}">
            <AdornedElementPlaceholder Name="adornedElement" />
        </Border>
        <Image HorizontalAlignment="Right" VerticalAlignment="Top"
               Width="16" Height="16" Margin="0,-9,-8,0" 
               Source="{Binding DataContext.UserGroup, Converter={converters:UserGroupToImageSourceConverter},
                        RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
               ToolTip="{Binding ElementName=adornedElement, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
    </Grid>
</ControlTemplate>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29006925

复制
相关文章

相似问题

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