原文:[WPF疑难]ErrorTemplate显示与隐藏问题

[WPF疑难]ErrorTemplate显示与隐藏问题

                                        周银辉

1,问题描述:



在为Binding提供验证模板时,我们需要使用一个ControlTemplate来为验证控件提供验证反馈,即是当验证失败时在被验证控件的旁边或外围提供一个具有明显视觉效果的UI元素以提醒用户(一个普遍的做法,比如文本框外围出现一个红色线框),这也就是传说中的Validation.ErrorTemplate。按照正常人的思维:ErrorTemplate(红色线框)的可见性应该随着被验证控件(文本框)的可见性的改变而动态改变。但目前事实并非如此,即便是用WPF默认的ErrorTemplate。这让人很抓狂,在用户看来这将是一个可笑而又弱智的错误。



让用户输入点什么:





出错了,显示一个红线框以提醒:





点击Expander将文本框隐藏起来,当红线框依然存在:







2,解决方案



2.1 思路

先看看我们的ErrorTemplate是如何编写的:

        <ControlTemplate x:Key="validationTemplate">

            <Border BorderBrush="Red"

                    BorderThickness="2" >

                <AdornedElementPlaceholder x:Name="holder" />

            </Border>

        </ControlTemplate>

其中AdornedElementPlaceholder 是一个占位符,表示修饰控件相对于ControlTemplate中其它元素所放置的位置(这个示例中用于文本框的占位),而Border则是我们的红线框。那么很自然地(这让我想起中学数学中的”同理可证、所以、显然“)我们可以将Border 的可见性与AdornedElementPlaceholder.AdornedElement(这里是我们文本框) 的可见性Binding起来而解决这个问题,的确如此



2.2 容易写出的错误代码:

        <ControlTemplate x:Key="validationTemplate">

            <Border BorderBrush="Red"

                    BorderThickness="2"

                    Visibility="{Binding ElementName=holder,Path=AdornedElement.Visibility} >

                <AdornedElementPlaceholder x:Name="holder" />

            </Border>

        </ControlTemplate>

错误的原因是,Visiblity属性是不能向下传递的。意思是说:假设一个grid中包含一个textBox,开始时两者均可见(Visibility == Visibility.Visible),当将grid.Visibility设置为Hiden后其它时并不会影响textBox.Visibility,虽然textBox的确看不见了。



2.3 正确的方式:

事实上你应该根据UIElement.IsVisible属性来检测元素是否可见(只读属性),通过UIElement.Visibility 来设置元素的可见性。(虽然这让人感觉如此之混乱)

<BooleanToVisibilityConverter x:Key="bvConverter" />

<ControlTemplate x:Key="validationTemplate">

            <Border BorderBrush="Red"

                    BorderThickness="2"

                    Visibility="{Binding ElementName=holder,Path=AdornedElement.IsVisible, Converter={StaticResource bvConverter}}">

                <AdornedElementPlaceholder x:Name="holder" />

            </Border>

        </ControlTemplate>

Done!

[WPF疑难]ErrorTemplate显示与隐藏问题的更多相关文章

  1. [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口

    原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 周银辉 现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我 ...

  2. WPF中控件的显示与隐藏

    1.WPF中控件的显示与隐藏的属性是 Visibility,它有3个枚举值 Visible, Hidden 和 Collapsed.其中Visible为可见,而 Hidden 和 Collapsed ...

  3. [WPF疑难]Hide me! not close

    原文 [WPF疑难]Hide me! not close [WPF疑难]Hide me! not close                               周银辉 有朋友遇到这样的一个问 ...

  4. C# 显示、隐藏窗口对应的任务栏

    WPF中全屏窗口,会自动隐藏任务栏. 那非全屏窗口如何隐藏任务栏?甚至有没有一种场景,隐藏任务后自定义一套系统任务栏来显示? 以下会分阶段讲述一些概念 1. 主屏任务栏 任务栏,其实也是一个窗口,主屏 ...

  5. display:none显示和隐藏

    <html> <head> <title>显示和隐藏问题</title> <meta charset="utf-8"/> ...

  6. EditText获取和失去焦点,软键盘的关闭,和软键盘的显示和隐藏的监听

    软键盘显示和隐藏的监听: 注: mReplayRelativeLayout是EditText的父布局 //监听软键盘是否显示或隐藏 mReplayRelativeLayout.getViewTreeO ...

  7. Composer根据Name显示与隐藏

    //主要设置 模型的显示与隐藏 private void TransmissionByData_AxSendSelectionChange(string domName, bool isVisible ...

  8. js 与JQuery显示及隐藏方法

    虽然以后两种方式都能让文本信息隐藏和显示 第一种文本隐藏以后还是会占居位置, 第二种则不会占位置. <p id="p1">这是一段文本.</p> <i ...

  9. Js控制显示、隐藏文本框中的密码

    Js控制显示.隐藏文本框中的密码,也可称为是一款小型的JavaScript星号密码破解器,点击会显示出密码类型的文本框中的真实信息,再次点击则还原,程序 主要是获取HTML元素对象,然后强制更改元素属 ...

随机推荐

  1. sed学习总结

    sed学习总结 sed工作流 测试文件:cat employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysad ...

  2. [Recompose] Add Lifecycle Hooks to a Functional Stateless Component using Recompose

    Learn how to use the 'lifecycle' higher-order component to conveniently use hooks without using a cl ...

  3. 多线程之线程通信条件Condition二

    接上一篇,实现Condition三个条件,有这样一个应用: 1. 有三个进程,第一个进程运行1次,第二个进程运行2次,第三个进程运行3次: 2. 先运行第二个进程,然后第一个,然后第三个: 3.  依 ...

  4. 用Apache Ivy实现项目里的依赖管理 分类: C_OHTERS 2014-07-06 18:11 564人阅读 评论(0) 收藏

    Apache Ivy是一个管理项目依赖的工具. 它与Maven  Apache Maven 构建管理和项目管理工具已经吸引了 Java 开发人员的注意.Maven 引入了 JAR 文件公共存储库的概念 ...

  5. 线程之一:JAVA线程基础 分类: B1_JAVA 2013-10-10 12:48 662人阅读 评论(0) 收藏

    参考core java,马士兵视频 1.线程的基本概念 (1)一个线程是一个程序内部的顺序控制流.   (2)线程和进程 –每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大. –线程: ...

  6. Android RadioGroup的RadioButton 选择改变字体颜色和背景颜色

    RadioGroup <RadioGroup android:id="@+id/client_charge_radiogroup" android:layout_width= ...

  7. 将Sublime Text2 加入右键菜单

    在googleread里面看有人推荐sublime text2.说开发很方便.就下载一个试试.写html还真的挺爽. 于是按照vim加入鼠标右键的方法.果然可以.这里和大家分享 1. 运行中输入 re ...

  8. 【u110】灾后重建

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前, ...

  9. [Grid Layout] Use auto-fill and auto-fit if the number of repeated grid tracks is not to be def

    What about the situation in which we aren’t specifying the number of columns or rows to be repeated? ...

  10. Opencv中integral计算积分图

    Paul Viola和Michael Jones在2001年首次将积分图应用在图像特征提取上,在他们的论文"Rapid Object Detection using a Boosted Ca ...