显示按钮上的验证点击mvvm wpf应用程序

时间:2014-03-31 05:19:11

标签: c# wpf xaml mvvm-light

我的代码在页面加载时正常工作..但我希望验证仅在单击按钮时才能工作

模型
Category.cs

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(() => CategoryName); }
        //set { SetValue(() => 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));
        }
    }

  }
}

Category.xaml

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">
 Text="{Binding Category.CategoryName, ValidatesOnDataErrors=True,                         UpdateSourceTrigger=PropertyChanged}" 
 HorizontalAlignment="Left" Height="75" Margin="53,36,0,0" TextWrapping="Wrap"     VerticalAlignment="Top" Width="259"/>
 <Label Content="{Binding ElementName=CategoryName,Path=  (Validation.Errors).CurrentItem.ErrorContent}" FontFamily="calibri" Foreground="Red"  HorizontalAlignment="Left" Margin="400,63,0,0" VerticalAlignment="Top"/>

 Text="{Binding Category.CategoryCode, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Height="39" Margin="53,168,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="259"/>

1 个答案:

答案 0 :(得分:0)

您必须编写自己的验证器类及其相关模板。 这是一个完整的Guide

希望这会有所帮助。