我正在开发一个 WPF 应用程序(使用 MVVM)并在我的 ViewModel 上实现了 IDataErrorInfo。我的部分验证检查是否已输入必填字段。这非常适合编辑现有记录,但在添加新记录时不能提供良好的用户体验。加载新视图后,必填字段将突出显示为无效。
有没有(最好是非hacky)解决方案?这似乎是一个非常标准的东西,所以我希望我错过了一些简单的东西。
我正在开发一个 WPF 应用程序(使用 MVVM)并在我的 ViewModel 上实现了 IDataErrorInfo。我的部分验证检查是否已输入必填字段。这非常适合编辑现有记录,但在添加新记录时不能提供良好的用户体验。加载新视图后,必填字段将突出显示为无效。
有没有(最好是非hacky)解决方案?这似乎是一个非常标准的东西,所以我希望我错过了一些简单的东西。
Instead of using "ValidatesOnDataErrors=True" you can add DataErrorValidationRule manually, with ValidatesOnTargetUpdated attribute:
<TextBox>
<TextBox.Text>
<Binding Path="..." ValidatesOnExceptions="true">
<Binding.ValidationRules>
<DataErrorValidationRule ValidatesOnTargetUpdated="false"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
使用一个标志来指示记录是否是新的。在您的 实现中检查此标志IDataErrorInfo
,并在用户第一次尝试验证输入时将该标志设置为 true。
我通常在我的实体或数据类上有一个子类,它在初始化后从我的错误字典中删除所有条目。我在实例化后调用它。
您可以更进一步,将一个初始化字段(布尔值)设置为新对象的 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。)在大多数情况下,我会创建一个方法来访问字典。