依赖控件的Silverlight验证?

时间:2009-12-19 06:32:09

标签: validation silverlight-3.0

我有Silverlight 3应用程序,有两个日期选择器,用于开始日期和结束日期。 它们是绑定到业务对象的数据,该业务对象实现验证逻辑,使得StartDate必须在EndDate之前,EndDate必须在StartDate之后。

到目前为止,非常好 - 当相应的setter中抛出验证异常时,两个控件都会显示相应的验证错误。

我的问题是,如果用户更改“其他”控件,使第一个控件中的“无效”日期现在有效,则第一个控件的状态不会更改(因为它的setter尚未被调用)。

例如,如果我将StartDate设置为2009年12月15日并将EndDate设置为2009年12月10日,则EndDate控件将正确进入无效状态。如果用户将StartDate更改为2009年12月9日,则EndDate控件仍被标记为无效,因为UI尚未调用EndDate setter。

是否存在强制UI重新验证的“干净”MVVM风格方法?

1 个答案:

答案 0 :(得分:1)

使用here中的ValidationScope类 基本上,它允许您将一些控件分组并在触发某个命令时验证该组,对于标准的东西很有效。

Xaml的几个文本框

<StackPanel local:ValidationScope.ValidationScope="{Binding PersonValidationScope}">
        <TextBox
            Text="{Binding Person.Name, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"
            local:ValidationScope.ValidateBoundProperty="Text" />
        <TextBox
            Text="{Binding Person.Age, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"
            local:ValidationScope.ValidateBoundProperty="Text" />
        <ComboBox
            ItemsSource="{Binding Salutations}"     
         SelectedItem="{Binding Person.Salutation, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}"
    local:ValidationScope.ValidateBoundProperty="SelectedItem" />
    <Button Content="Save" Click="SaveButtonClick" />
</StackPanel>

ViewModel看起来像这样

public void Save()
{
    // This causes all registered bindings to be updated
    PersonValidationScope.ValidateScope();
    if (PersonValidationScope.IsValid())
    {
        // Save changes!
    }
}

按照ValidationScope类的链接。