[英]How to implement (bubbling) validation events for custom WPF control
我已經開發了一個自定義WPF控件:
public partial class PercentTextbox : UserControl, IDataErrorInfo, INotifyDataErrorInfo
然后將該UserControl
與其他一些UserControl
一起放入UserControl
:
<UserControl x:Class="UserControlContainingPercentTextboxAndStuff" DataContext="Something" ...>
<Grid>
<mycontrols:PercentTextbox Value="{Binding MyPercentageValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True}" ... />
<TextBox ... />
<mycontrols:PercentTextbox ... />
<TextBox ... />
<TextBox ... />
</Grid>
</UserControl>
最后,我使用另一個包裝的UserControl
將上述UserControl
顯示為對話框:
<UserControl ...>
<Grid>
<local:UserControlContainingPercentTextboxAndStuff ... />
<Button x:Name="SaveButton" Content="Save" ... />
<Button x:Name="CancelButton" Content="Cancel" ... />
</Grid>
</UserControl>
在后者后面的代碼中,我要訂閱所有驗證錯誤,如果有錯誤,請禁用保存按鈕。
Validation.AddErrorHandler(this, (sender, e) =>
{
SaveButton.IsEnabled = false;
Debug.WriteLine(e.Error);
});
我當時在想,如果要實現IDataErrorInfo
或INotifyDataErrorInfo
,WPF會以某種方式神奇地為我處理內容,並創建ValidationError事件(該事件會冒泡到UserControl
。但是顯然,我在這里缺少了一些重要的東西。)
我的問題是:我必須在自定義控件PercentTextbox
中實現什么才能在任意位置使用它,並且仍然可以獲得可以在容器UserControl
使用的某種冒泡驗證信息(例如,禁用SaveButton)。
IDataErrorInfo
和INotifyDataErrorInfo
應該在模型端而不是UI端實現。 然后,可以在Binding
上設置ValidatesOnDataErrors = True
或ValidatesOnNotifyDataErrors = True
選項,以便使綁定驗證系統跳入其中。網絡上有一些不錯的教程。 不是UI告訴您某些內容無效,而是該UI表示的數據。
數據驗證概念與數據綁定緊密結合。 如果希望用戶控件執行其自己的“ UI”驗證,請使用依賴項屬性的強制和驗證回調 。 但是,這與綁定系統的數據驗證無關。 驗證回調將導致屬性系統引發您可以根據需要處理的異常(例如,可以將ExceptionValidationRule
用於綁定)。
看一下Validation.Error
附加事件文檔 (實際上您是通過調用Validation.AddErrorHandler
來嘗試觀察的)。 它指出:
在綁定元素遇到驗證錯誤時發生, 但僅對於NotifyOnValidationError值設置為true的綁定發生 。
因此,您現在有兩個選擇:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.