在MVVM WPF应用程序上单击按钮显示验证

本文关键字:单击 按钮 显示 验证 程序上 应用程序 MVVM WPF 应用 | 更新日期: 2023-09-27 17:55:06

我的代码在页面加载时正常工作,但我希望只有在单击按钮时才能进行验证


模型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"/>

在MVVM WPF应用程序上单击按钮显示验证

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