2010-09-09 114 views
18

這是一個WPF whodunnit!預計當它沒有出現我的驗證寺廟
Validation ErrorTemplate沒有顯示數據錯誤

的問題

基本上,我使用我的視圖模型IDataErrorInfo的提供有關數據輸入錯誤的反饋。我可以看到這被調用並按預期工作,但綁定控件的驗證錯誤模板永遠不會被WPF顯示!

我已經嘗試使用內置的默認文本框紅色邊框錯誤模板,樣式錯誤模板和硬編碼模板。這些都不會在數據錯誤情況下顯示。

我的繼承人XAML綁定代碼:

<TextBox x:Name="txtCaseNumber" 
Text="{Binding Path=CaseNumber, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/> 

Wierdly,誤差會進入Validation.Errors集合。以下代碼導致我的IDataErrorInfo錯誤消息顯示在綁定控件旁邊。這導致我認爲問題在xaml方面,而不是視圖模型方面。

<ContentPresenter 
Content="{Binding ElementName=txtCaseNumber, Path=(Validation.Errors).CurrentItem}" /> 

此外, System.Windows.Controls.Validation.GetHasError(txtCaseNumber)返回true。

我在winforms中託管WPF,如果這有所作爲。我無法在我的代碼或樣式中找到任何對Validation或ErrorTemplate的引用,所以我非常確定這不是一個樣式化的自己的目標。

回答

41

破解它。

ErrorTemplate附加屬性uses the adorner layer顯示通過IDataErrorInfo報告的數據驗證失敗的錯誤模板。對於所有情況下的所有控件,Adorner層爲not always available。您的控制或其父母之一需要明確提供一個。

默認的窗口控件模板包含一個AdornerDecorator,它爲子項啓用裝飾器圖層。這就是爲什麼我的其他窗口顯示我的錯誤模板很好,因爲此窗口使用默認控制模板

未顯示我的錯誤模板的窗口使用了爲我的窗口提供ControlTemplate的樣式。該控件模板沒有提供<AdornerDecorator>,因此沒有裝飾圖層來顯示我的錯誤模板。

該修復過程與使用<AdornerDecorator>包裝我的窗口控制模板一樣簡單。

+5

先生,我向你致敬!我在VS擴展中有一個UserControl> Expander> Textbox。但它不會顯示IDataErrorInfo錯誤。做了一個示例WPF應用程序來承載UC - 問題持續存在(VS Extn排除)。製作了另一臺虛擬機 - 工作排除了虛擬機。然後我打了你的帖子 - 在窗口和UC中添加了幾個Loaded事件處理程序。果然,UC返回了一個空AdornerLayer。用AdornerDecorator包裝擴展器的內容,它工作!我放慢了2天的速度..活着n學習我猜。再一次感謝持久和時間爲後人記錄它! – Gishu 2010-10-14 18:03:12

+0

沒有probs!我也失去了2天:( – 2010-10-14 18:48:10

+1

這只是解決了我沒有提供AdornerDecorator的Metro風格窗口的問題。謝謝! – mortware 2012-08-06 15:51:00