簡體   English   中英

如何為自定義WPF控件實現(冒泡)驗證事件

[英]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);
});

我當時在想,如果要實現IDataErrorInfoINotifyDataErrorInfo ,WPF會以某種方式神奇地為我處理內容,並創建ValidationError事件(該事件會冒泡到UserControl 。但是顯然,我在這里缺少了一些重要的東西。)

我的問題是:我必須在自定義控件PercentTextbox中實現什么才能在任意位置使用它,並且仍然可以獲得可以在容器UserControl使用的某種冒泡驗證信息(例如,禁用SaveButton)。

IDataErrorInfoINotifyDataErrorInfo應該在模型端而不是UI端實現。 然后,可以在Binding上設置ValidatesOnDataErrors = TrueValidatesOnNotifyDataErrors = True選項,以便使綁定驗證系統跳入其中。網絡上有一些不錯的教程。 不是UI告訴您某些內容無效,而是該UI表示的數據。

數據驗證概念與數據綁定緊密結合。 如果希望用戶控件執行其自己的“ UI”驗證,請使用依賴項屬性的強制和驗證回調 但是,這與綁定系統的數據驗證無關。 驗證回調將導致屬性系統引發您可以根據需要處理的異常(例如,可以將ExceptionValidationRule用於綁定)。

看一下Validation.Error附加事件文檔 (實際上您是通過調用Validation.AddErrorHandler來嘗試觀察的)。 它指出:

在綁定元素遇到驗證錯誤時發生, 但僅對於NotifyOnValidationError值設置為true的綁定發生

因此,您現在有兩個選擇:

  • 在模型端實現驗證並相應地設置綁定(對於綁定到自定義控件屬性的每個綁定,您都必須執行此操作)
  • 使用依賴項屬性驗證回調

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM