我正在开发一个WPF应用程序(使用MVVM)并在我的ViewModel上实现了IDataErrorInfo。我的部分验证检查是否已输入必填字段。这非常适合编辑现有记录,但在添加新记录时不能提供良好的用户体验。加载新视图后,必填字段将突出显示为无效。
是否有(最好是非hacky)解决方案?这似乎是一个非常标准的事情,所以我希望我错过了一些简单的东西。
答案 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的属性。加载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。)在大多数情况下,我会创建一个方法来代替字典。