How to force validation errors update on View from ViewModel using IDataErrorInfo?

surfen picture surfen · Apr 3, 2012 · Viewed 17.4k times · Source

I have a MVVM-based Window with many controls, and my Model implements IDataErrorInfo.

There is also a SaveCommand button, which performs validation by analysing Model.Error property.

The view displays the default red border around controls with errors only when I change the value of a particular control, or when I notify about the change of that property using PropertyChanged.

How can I force View to display all Validation errors even when I didn't touch the controls?

All my validation bindings include ValidatesOnDataErrors=True, NotifyOnValidationError=True.

I know one solution is to have an aggregate box with all the errors, but I would prefer to display errors on per-control basis.

I don't want to trigger Model.NotifyPropertyChanged for each bound property from ViewModel.

I use WPF 4.0, not Silverlight, so INotifyDataErrorInfo won't work.

Answer

Brandorf picture Brandorf · May 15, 2012

You mention that you don't want to raise property changed for the properties you bind to, but that's really the simplest way to accomplish this. Calling PropertyChanged with no parameter will raise for all properties in your viewmodel.

Alternatively you can update the bindings (and force revalidation) on any control like this:

myControl.GetBindingExpression(ControlType.ControlProperty).UpdateSource();