如何阻止IDataErrorInfo触发新项目?

时间:2011-08-29 14:07:19

标签: wpf mvvm idataerrorinfo

我正在开发一个WPF应用程序(使用MVVM)并在我的ViewModel上实现了IDataErrorInfo。我的部分验证检查是否已输入必填字段。这非常适合编辑现有记录,但在添加新记录时不能提供良好的用户体验。加载新视图后,必填字段将突出显示为无效。

是否有(最好是非hacky)解决方案?这似乎是一个非常标准的事情,所以我希望我错过了一些简单的东西。

3 个答案:

答案 0 :(得分:4)

您可以使用ValidatesOnTargetUpdated属性手动添加DataErrorValidationRule,而不是使用“ValidatesOnDataErrors = True”:

<TextBox>
   <TextBox.Text>
     <Binding Path="..." ValidatesOnExceptions="true">
        <Binding.ValidationRules>
            <DataErrorValidationRule ValidatesOnTargetUpdated="false"/>
        </Binding.ValidationRules>
     </Binding>
   </TextBox.Text>
</TextBox>

答案 1 :(得分:3)

使用一个标志来指示记录是否为新记录。在IDataErrorInfo的实现中检查此标志,并在用户第一次尝试验证输入时将标志设置为true。

答案 2 :(得分:1)

我的实体或数据类通常有一个sub,它在初始化后从我的Error字典中删除所有条目。我在实例化后称之为。

你可以更进一步,有一个初始化字段(布尔值),对于新对象,设置为False,对于现有对象,设置为True。

您不希望用户出现一堆错误/验证模板,因为他们已经生成了一个新对象,但尚未使用数据填充它。

ViewModel示例

在这个例子中,我有来自ViewModel的属性。加载Shipment对象时,该属性在错误字典上调用Clear方法。如果Shipment是数据库中的持久记录,则它应具有有效数据,因为必须对其进行验证才能保存到DB。如果它是新的,则删除条目并向用户显示准备输入的新表格。

Public Property ShipmentRecord() As Shipment
    Get
        Return _shpShipmentRecord
    End Get
    Set(ByVal value As Shipment)
        _shpShipmentRecord = value
        ShipmentRecord.m_dirtyFields.Clear()
        OnPropertyChanged("ShipmentRecord")
    End Set
End Property

不幸的是,这是我能找到的第一个例子,它直接访问m_dirtyFields字典(它最初是私有的,但我将其设置为Friend。)在大多数情况下,我会创建一个方法来代替字典。