原文:[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!

最新文章

  1. centos6环境下搭建irc服务器
  2. canvas案例——画时钟
  3. 使用MVVM框架avalon.js实现一个简易日历
  4. 如何解决python中urlopen超时问题
  5. [原]Unity3D深入浅出 - 认识开发环境中的Component(组件)菜单
  6. 企业2.0杀出一号种子选手 “Linkwedo”横空出世
  7. asp.net 开发问题:Web 服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值。
  8. Swift中UITableView的简单使用
  9. Billboard(线段树)
  10. tomcat 7 启动超时设置。。。实在太隐蔽了
  11. java spring mvc 全注解
  12. iOS中的NSURLProtocol
  13. 数位DP::SoSDP
  14. golang esl api
  15. python2.x 到 python3.x 中“url”部分变化
  16. linux中断源码分析 - 概述(一)
  17. 开发人员如何从官网首页进入下载JDK历史版本
  18. freeswitch控制台日志级别设置以及存储
  19. sqlitestudio
  20. 命令行下从bak文件恢复sqlserver数据库方法

热门文章

  1. ZOJ 3204 Connect them 继续MST
  2. POJ 1775 Sum of Factorials (ZOJ 2358)
  3. HTML5开发移动web应用——SAP UI5篇(9)
  4. js课程 2-6 js如何进行类型转换及js运算符有哪些
  5. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)
  6. ios开发事件处理之:五:事件的响应
  7. JNI:no implementation found in native...
  8. protobuf入门教程
  9. Android 离线缓存的高速实现
  10. Vert.x ——概述