Validating model properties

Jul 5, 2011 at 7:18 AM

Hi Tony,

Here is my situation:

MODEL:

Class derived from SimpleMVVMToolkit base class. I have implemented INotifyDataErrorInfo interface and have also written validation rules using Validator in the model itself. The properties are decorated with Data Annotation for validation.

       private string _Name;
        [Required(ErrorMessageResourceType = typeof(ValidationResource), ErrorMessageResourceName = "OverviewModel_Name")]
        public string Name
        {
            get { return _Name; }
            set
            {
                if (_Name != value)
                {
                    ValidateProperty("Name", value);
                    _Name = value;
                    NotifyPropertyChanged(m => m.Name);
                }
            }
        }

and the ValidateProperty looks like:

protected void ValidateProperty(string propertyName, object value)
        {
            var results = new List<ValidationResult>();
            bool isValid = Validator.TryValidateProperty(value, new ValidationContext(this, null, null) { MemberName = propertyName },
                                          results);
            if (isValid)
            {
                RemoveErrorsForProperty(propertyName);
            }
            else
            {
                AddErrorsForProperty(propertyName, results);
            }
            RaiseErrorsChanged(propertyName);
        }

VIEWMODEL:

I have created a viewmodel from ViewModelDetailBase and passed OverviewModel as parameter.

public class OverviewViewModel : ViewModelDetailBase<OverviewViewModel,OverviewModel>
    {
        #region Initialization and Cleanup

        // TODO: Add a member for IXxxServiceAgent
        //private /* IXxxServiceAgent */ serviceAgent;

        // Default ctor
        public OverviewViewModel() { }

        // TODO: Ctor to set base.Model to DetailType
        public OverviewViewModel(OverviewModel model)
        {
            base.Model = model;
        }

        // TODO: ctor that accepts IXxxServiceAgent
        //public OverviewViewModel(/* IXxxServiceAgent */ serviceAgent)
        //{
        //    this.serviceAgent = serviceAgent;
        //}

        #endregion
}

VIEWMODEL LOCATOR:

I have created a viewmodel locator as well.

      // Create OverviewViewModel on demand
        public OverviewViewModel OverviewViewModel
        {
            get { return new OverviewViewModel(); }
        }

VIEW:

I have binding in the view as:

Value="{Binding Model.Name, Mode=TwoWay}"

 

RESULT:

Now when I run the application, I do not get any data binding/validation. I put a breakpoint at property set but it never gets there. and hence no validation as well.

Could you please let me know what my problem is and if I am doing it the right way?

 

 


Jul 5, 2011 at 8:20 AM

OK, this was pretty simple. I created a viewmodellocator but did not pass in the model as a parameter. Hence, my binding and validation was not working. It works now! My view model locator now looks like:

// Create OverviewViewModel on demand
        public OverviewViewModel OverviewViewModel
        {
            get { return new OverviewViewModel(new OverviewModel()); }
        }

Coordinator
Jul 6, 2011 at 4:24 PM

Glad it worked out. I plan to incorporate support for INotifyDataErrorInfo into the next release of the toolkit.

Tony