我有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风格方法?
答案 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类的链接。