2014-03-31 40 views
0

我的代碼工作正常時,頁面loads..but我想驗證,只有當按鈕被點擊顯示按鈕點擊確認上MVVM WPF應用程序

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

回答

0

您必須編寫自己的驗證器類及其相關模板。 這裏是一個完整的Guide

希望這會有所幫助。