引用:
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來做.
享受這一切吧!
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/zxqtiger/archive/2010/06/22/5686869.aspx