在WPF中显示 验证数据有效性信息

来源:互联网 发布:linux手册下载 编辑:程序博客网 时间:2024/06/06 05:12

引用:

http://blog.joycode.com/vbcti/archive/2008/09/17/115273.joy

[原文作者]:Beth Massi

[原文链接]:Displaying Data Validation Messages in WPF

 

以下是我特别关注的内容:

 

设置自定义有效性验证Style
   我们显然希望能让用户知道这里的问题怎么解决.让我们来做一些简单的例子在ToolTip中来显示错误信息. 现在我们能在Window.Resources部分中创建一个Style,然后应用于这个Form中的TextBox. 这个 Style创建一个触发器,Validation.HasError变成True的时候 ,用来设置ToolTip属性为有效性验证的错误信息 .
<Window.Resources>
    <Style TargetType="TextBox">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip"
                        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                        Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
 
 
   现在当我们再次运行这个程序,当鼠标置于TextBox上的时候你能看到显示在ToolTip里的有效性验证信息. 这比之前的好了些 ! 但是这个办法只适用于TextBox. 那像 checkBox,ComboBox等这样的控件又怎么办呢 ? 我们需要把这些都声明在一个适应于整个应用程序的地方 .没问题,我们可以把这种Style贴在Application.Resources. 我们也能指定 TargetType=”Control”,这样我们就能定义另外的适合基于这种Style的其他控件的Style.打开Application.xaml,将它们加入Resources部分:
 
<Application.Resources>
    <Style TargetType="Control" x:Key="myErrorTemplate">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip"
                    Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                    Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
    <Style TargetType="TextBox" BasedOn="{StaticResource myErrorTemplate}" />
    <Style TargetType="CheckBox" BasedOn="{StaticResource myErrorTemplate}" />
    <Style TargetType="ComboBox" BasedOn="{StaticResource myErrorTemplate}" />
</Application.Resources>
    我们只需指定模板的x:Key,然后就能在继承的Style上设置BasedOn属性了 . 现在整个应用程序的控件都能应用这种Style了。
    替换整个的错误模板
    到目前为止,我们所做的是指定一个Style触发器了. 默认的WPF错误模板仍然在使用中因为我们还是看到控件的红边框. 这里我们能在Applicaion.Resource定义一个新的错误模板来完全的改变这个错误模板.让我们来通过一个简单的示例来示范创立一个在控件上显示一般错误信息的错误模板.Style 中的Trigger上面的部分(我们会把ToolTip信息放置于那儿),我们设置Validation.ErrorTemplate属性的值为我们自己的控件模板。
 
<Style TargetType="Control" x:Key="myErrorTemplate">
        <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <TextBlock Foreground="Red" Text="DOH! Thank you for trying."/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip"
                Value="{Binding RelativeSource={x:Static RelativeSource.Self},
                Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>
      现在当我们再次运行,我们仍然可以看到我们的ToolTip当我们将鼠标放在控件上的时候.但是我们将在我们自己的控件模板中的TextBlock覆盖了原来的控件,注意:现在已经没有红色的边框了:

 

 

    好的, 我承认这是一个蹩脚的示例,.问题(除了这讽刺的消息)TextBlock确实覆盖了那控件,你必须将鼠标置于边缘来显示ToolTip. 另外一个问题当然是如果我们开始再次输入字段值,直到我们输入完毕之后那个信息才会消失,这是很不方便的.
   你可以插入一个DockPanel到控件模板里面,然后把TextBlock停靠在右边以在控件后面显示文本 (这里让我们只显示一个星号),如果说你仍然想有红色边框在控件周围,我们可以在我们的XAML中为错误模板的Setter.Value设置一个叫AdornedElementPlaceholder的特别元素:
<Setter Property="Validation.ErrorTemplate">
    <Setter.Value>
        <ControlTemplate>
            <DockPanel LastChildFill="True">
                <TextBlock DockPanel.Dock="Right"
                        Foreground="Red"
                        FontSize="11pt"
                        FontWeight="Bold">*
                </TextBlock>
                <Border BorderBrush="Red" BorderThickness="1">
                    <AdornedElementPlaceholder Name="myControl"/>
                </Border>
            </DockPanel>
        </ControlTemplate>
    </Setter.Value>
</Setter>
 

 

 

   

     在WPF中用.net framework 3.5来验证你的数据对象的有效性跟之前用IdataErrorInfo接口的Winform是一样的.然而,WPF式样和控件模板可以非常方便的显示可视线索给用户.如果你能发挥想象,你就可以用WPF来做.    

     享受这一切吧!

 

原创粉丝点击