title: showing validation on button click on mvvm wpf application
body: <p>my code works properly when the page loads..but i want the validation to be worked only when the button is clicked</p>
  
  <p>model<br>
  Category.cs</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.ComponentModel.DataAnnotations;
  using System.Text;
  System.Threading.Tasks;
  namespace BillingApplication.Model
  {
  
  class Category : IDataErrorInfo, INotifyPropertyChanged
  {
      private short categoryId;
      private string categoryName;
      private string categoryCode;
  
      //[Unqiue(ErrorMessage = "Duplicate Id. Id already exists")]
      //[Required(ErrorMessage = "Id is Required")]
  
  class Category : IDataErrorInfo, INotifyPropertyChanged
  {
      private short categoryId;
      private string categoryName;
  
  
      private string categoryCode;
  
      //[Unqiue(ErrorMessage = "Duplicate Id. Id already exists")]
      //[Required(ErrorMessage = "Id is Required")]
  
      public short CatogoryId
      {
  
          get
          {
              return CatogoryId;
          }
          set
          {
              CatogoryId = value;
          }
      }
      [Required(ErrorMessage = "Name is Required")]
   public string CategoryName
      {
          //get { return GetValue(() =&gt; CategoryName); }
          //set { SetValue(() =&gt; CategoryName, value); }
          get
          {
              return categoryName;
          }
          set
          {
              categoryName = value;
              NotifyPropertyChanged("CategoryName");
          }
      }
   protected void NotifyPropertyChanged(string propertyName)
      {
          if (this.PropertyChanged != null)
          {
              // property changed
              this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
              // send app message (mvvm light toolkit)
              //if (message != null)
              //    message(this.IsValid);
          }
      }
  
  
    [Required(ErrorMessage = "cODE is Required")]
      public string CategoryCode
      {
           get
          {
              return categoryCode;
          }
          set
          {
              categoryCode = value;
              NotifyPropertyChanged("CategoryCode");
          }
      }
  
  
      #region IDataErrorInfo Members
  
      string IDataErrorInfo.Error
      {
          get
          {
              return null;
              //throw new NotImplementedException();
          }
      }
  
      string IDataErrorInfo.this[string propertyName]
      {
          get
          {
            return  GetValidationError(propertyName);
          }
      }
  
      public event PropertyChangedEventHandler PropertyChanged;
      private void OnPropertyChanged(string propertyName)
      {
          if (PropertyChanged != null)
          {
              PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
          }
      }
      #endregion
      #region  Validation
      static readonly string[] ValidateProperties = { "CategoryName","CategoryCode" };
      public bool IsValid
      {
          get
          {
              foreach (string property in ValidateProperties)
              //{
                  if (GetValidationError(property) != null)
                          return false;
  
                  return true;
              //}
          }
  
      }
      string GetValidationError(string propertyName)
      {
          string error = null;
          switch (propertyName)
          {
              case "CategoryName":
                  error = ValidateCategoryName();
                  break;
  
          }
          switch (propertyName)
          {
              case "CategoryCode":
                  error = ValidateCategoryCode();
                  break;
          }
          return error;
  
      }
  
      private string ValidateCategoryCode()
      {
          if (string.IsNullOrWhiteSpace(CategoryCode))
          {
              return "Category code Cannot be empty";
          }
          return null;
  
      }
      private string ValidateCategoryName()
      {
          if (string.IsNullOrWhiteSpace(CategoryName))
          {
              return "Category Name Cannot be empty";
          }
          return null;
  
      }
      #endregion
  
     }
  }
  
  **viewModel**
  
  *CategoryViewModel.cs*
  
  using System;
  using System.Collections.ObjectModel;`
  using System.ComponentModel;
  using System.IO;
  using System.Windows;
  using GalaSoft.MvvmLight;
  using System.Xml.Serialization;
  using BillingApplication.Model;
  using System.Xml.Serialization;
  using BillingApplication.Model;
  
  
  class CategoryViewModel : INotifyPropertyChanged
  {
      public CategoryViewModel()
      {
          Category = new Category
          {
               CategoryName="",
               CategoryCode=""
          };
      }
      public Category Category
      {
          get;
          set;
      }
      public event PropertyChangedEventHandler PropertyChanged;
      private void OnPropertyChanged(string propertyName)
      {
          if (PropertyChanged != null)
          {
              PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
          }
      }
  
    }
  }
  </code></pre>
  
  <p><em>Category.xaml</em></p>
  
  <pre><code>xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlnsBig Grin | :-D ="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:ignore="http://www.ignore.com"
  xmlns:model="clr-namespace:BillingApplication.Model"
  xmlns:views="clr-namespace:BillingApplication.Views"
  mc:Ignorable="d"
  
  xmlns:local="clr-namespace:BillingApplication.ViewModel"
  Title="Category" Width="867.164" Height="532.836"&gt;
   Text="{Binding Category.CategoryName, ValidatesOnDataErrors=True,                         UpdateSourceTrigger=PropertyChanged}" 
   HorizontalAlignment="Left" Height="75" Margin="53,36,0,0" TextWrapping="Wrap"     VerticalAlignment="Top" Width="259"/&gt;
   &lt;Label Content="{Binding ElementName=CategoryName,Path=  (Validation.Errors).CurrentItem.ErrorContent}" FontFamily="calibri" Foreground="Red"  HorizontalAlignment="Left" Margin="400,63,0,0" VerticalAlignment="Top"/&gt;
  </code></pre>
  
  <p></p>
  
  <pre><code> Text="{Binding Category.CategoryCode, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="39" Margin="53,168,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="259"/&gt;
  </code></pre>