I have a grid bound to a list of a view model class I will call "A". Class A implements INotifyDataErrorInfo. As each property of A is set, the value of the changed property is validated, the set of errors is updated, and the ErrorChanged event is fired for that property--this is a pretty typical class that implements INotifyDataErrorInfo.
When the user clicks the New Item Row, I set some initial property values in the AddingNewDataItem event. Then when the new data row displays before the user has begun to type in the first field, a few fields are already highlighted with errors. After adding some logging, I found that the data grid is making a copy of the object I create in the AddingNewDataItem handler. Each property in this copy is set which causes validation to fire off, and some fields show errors when initially shown to the user. I don't want this. I only want to show errors after the user edits the field or attempts to commit a row with errors.
I also noticed the grid control calls HasErrors() on the original source object made in the event handler, not the copy it makes, which seems odd to me.
Is this the expected behavior? I want to display a newly inserted row with no errors and some custom initial values, but that copy the grid makes sorta ruins the process. How do I work around this?
Below is my log. It begins with the hash code of the ViewModel
// NOTE: All this occurs on insert, no user edits
// These first validation calls are in the AddingNewDataItem event when I initialize some properties.
57073170: ValidateProperty JobId, 0 errors.
57073170: ValidateProperty Quantity, 0 errors.
57073170: ValidateProperty State, 0 errors.
57073170: ValidateProperty Part, 0 errors.
57073170: ValidateProperty PartId, 1 errors.
57073170: ClearErrors() //clear errors so that the fields don't indicate errors until the user sets them or the row is validated
// Done with AddingNewDataItem event handler in my code
57073170: HasErrors() returned False
57073170: HasErrors() returned False
57073170: HasErrors() returned False
57073170: GetErrors(State) returned empty list
57073170: HasErrors() returned False
57073170: HasErrors() returned False
57073170: GetErrors(State) returned empty list
57073170: GetErrors(PartNumber) returned empty list
57073170: GetErrors(Quantity) returned empty list
57073170: GetErrors(Length) returned empty list
57073170: GetErrors(ComponentType) returned empty list
57073170: GetErrors(Label) returned empty list
57073170: GetErrors(ElevationId) returned empty list
57073170: HasErrors() returned False
57073170: HasErrors() returned False
57073170: HasErrors() returned False
57073170: HasErrors() returned False
//NOTE: looks like new object is now created by RadGridView after this point?
13218022: ValidateProperty PartId, 1 errors.
13218022: ValidateProperty PartNumber, 0 errors.
13218022: ValidateProperty Description, 0 errors.
13218022: ValidateProperty Quantity, 0 errors.
13218022: ValidateProperty ComponentType, 0 errors.
13218022: ValidateProperty Label, 1 errors. // This error shows in the UI clicking Add Item Row
13218022: ValidateProperty ElevationId, 1 errors. // This error shows in the UI after clicking Add Item Row
13218022: ValidateProperty JobId, 0 errors.
13218022: ValidateProperty KeepAlways, 0 errors.
13218022: ValidateProperty Length, 0 errors.
13218022: ValidateProperty Part, 0 errors.
13218022: ValidateProperty PartId, 1 errors.
13218022: ValidateProperty Id, 0 errors.
13218022: ValidateProperty State, 0 errors.
// HasErrors is called on the original and not the new object...
57073170: HasErrors() returned False
57073170: HasErrors() returned False
57073170: HasErrors() returned False
57073170: HasErrors() returned False
57073170: HasErrors() returned False
57073170: GetErrors(PartNumber) returned empty list
57073170: HasErrors() returned False
57073170: HasErrors() returned False
57073170: GetErrors(PartNumber) returned empty list
57073170: GetErrors(PartNumber) returned empty list
57073170: GetErrors(PartNumber) returned empty list