![](/img/trans.png)
[英]WPF with MVVM and DataAnnotations, Validation Errors in a UserControl
[英]Accessing Validation Errors in a UserControl
我創建了一個WPF(.Net 4)UserControl,其中包含一些ComboBox和一個TextBox。 在XAML中,某些ValidationRules綁定到了TextBox。 如果TextBox包含無效數據,則會顯示一個紅色框,並且工具提示設置為錯誤描述。 效果很好。
接下來,我在窗體上放置了該UserControl的兩個實例,並添加了一個按鈕。 在XAML中,按鈕連接到ViewModel的RelayCommand。 現在,我希望僅當兩個UserControl都僅包含有效數據時才啟用按鈕。
我想這不是問題,讓我使用在其他地方都可以使用的策略。 我添加了一個觸發器:
<Button Content="_OK" ... Command="{Binding Path=OKCommand}">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="false" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=cascadingComboFrom, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=cascadingComboTo, Path=(Validation.HasError)}" Value="false" />
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="true" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
但是有一個陷阱:UserControls的Validation.HasError始終為false-UserControl內部的某個元素的驗證失敗,而不是UserControl本身的驗證失敗。
我知道我可以注冊按鈕的Click事件,使用“ 檢測WPF驗證錯誤”中顯示的方法在那里檢查有效性,並通過將RoutedEventArgs的Handled屬性設置為true來阻止執行RelayCommand。 但這看起來更像是WTF,而不是WPF。
你有什么建議? 如何檢索UserControl的子代的驗證錯誤? 或者如何在RelayCommand的CanExecute方法中獲取它們? 還是其他技巧?
您可以在命令綁定上設置一個名為ValidatesOnDataErrors
的屬性。
實現看起來像這樣:
<Button Content="_OK" Command="{Binding, Path=OKCommand, ValidatesOnDataErrors=True}"/>
您可以在此處了解更多信息。
該Button.IsEnabled
屬性已經為硬連線到CanExecute
你的方法RelayCommand
,因此,所有你需要做的就是到返回值設置為false
時,表單字段是無效的:
private bool CanExecute(object commandParameter)
{
return areFormFieldsValid;
}
現在,如何將bool areFormFieldsValid
變量設置為true
或false
取決於您……有幾種方法可以這樣做。 就個人而言,我更喜歡使用IDataErrorInfo
接口 ,該接口具有您可以檢查的方便的Error
屬性。 關於如何實現此功能的在線教程很多,因此在這里我不再重復……但是,最終結果是這樣的:
private bool CanExecute(object commandParameter)
{
return string.IsNullOrEmpty(yourDataObject.Error);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.