簡體   English   中英

訪問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變量設置為truefalse取決於您……有幾種方法可以這樣做。 就個人而言,我更喜歡使用IDataErrorInfo接口 ,該接口具有您可以檢查的方便的Error屬性。 關於如何實現此功能的在線教程很多,因此在這里我不再重復……但是,最終結果是這樣的:

private bool CanExecute(object commandParameter)
{
    return string.IsNullOrEmpty(yourDataObject.Error);
}

暫無
暫無

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

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