2016-03-30 21 views
1

Csharp MVVM projesinde çalışıyorum ve DataMetels modelinde değil, modellerde Data.Annotations yönergesinin kullanılmasının mümkün olup olmadığını bilmek istiyorum. Öyleyse nasıl ?Veri ek açıklamaları doğrudan modellerde nasıl kullanılır?

[Dapper.Key] 
[Required(ErrorMessage = "This field is requierd")] 
[Range(1, int.MaxValue, ErrorMessage ="Only Int")] 
public int? Tic_Id { get; set; } 

[Required(ErrorMessage = "This field is requierd")] 
public DateTime Tic_Date { get; set; } 

Benim ViewModel (kullanmak IDataErrorInfo):

[RaisePropertyChanged] 
    public virtual Ticket FicheItem {get;set;} 

Ve Görünüm

<!-- ID --> 
     <TextBlock Grid.Row="1" Text="ID :" Style="{StaticResource FicheLabelStyle}"/> 
     <TextBox Name="ID" Grid.Row="1" Grid.Column="1" 
        IsEnabled="True" 
        Text="{Binding FicheItem.Tic_Id, UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True,NotifyOnValidationError=True,Mode=TwoWay}" 
        Style="{StaticResource FicheTextboxStyleNumber}"/> 
     <TextBlock Grid.Column="1" Grid.Row="2" Name="IDError" Text="{Binding (Validation.Errors)[0].ErrorContent, ElementName=ID}" Foreground="Red" Margin="19,3,0,0" 
        Visibility="{Binding ElementName=IDError, Path=Text,Converter={StaticResource FicheErrorVisibilityConverter},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 


     <!-- Date --> 
     <TextBlock Grid.Row="3" Text="Date :" Style="{StaticResource FicheLabelStyle}"/> 
     <TextBox Grid.Row="3" Grid.Column="1" Name="Date" 
       Text="{Binding FicheItem.Tic_Date, ValidatesOnDataErrors=True, NotifyOnValidationError=True,UpdateSourceTrigger=PropertyChanged}" 
       Style="{StaticResource FicheTextboxStyleText}" /> 
     <TextBlock Grid.Column="1" Grid.Row="4" Name="DateError" Text="{Binding (Validation.Errors)[0].ErrorContent, ElementName=Date}" Foreground="Red" Margin="19,3,0,0" 
        Visibility="{Binding ElementName=DateError, Path=Text,Converter={StaticResource FicheErrorVisibilityConverter},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 

Ama bunu

O, Benim Modeli (sınıf Bilet) gibi düşünce çalışmıyor ...

+0

Modelleri doğrudan görünümlerinizde kullanmayın, Görünüm ve Model'den sıkı bir bağlantı oluşturur. MVVM'nin temel amacı onları çözmektir. – Tseng

+0

Tamam, Modelimin özelliklerini viewModel öğesinde ayırmalı ve veri ek açıklamalarını kullanmalıyım. Ama bir orm (dapper) kullanarak, belirli bir anda, bir nesnede birlikte olmalıyım? örnek: cnn.Insert (myObject). Her seferinde bunu yapabilirim, yeni Öğe {prop = ayrı mülküm ....} yani çok fazla alanım varsa ... –

cevap

0

IDataErrorInfo arabirimini Ticket sınıfında uygulamanız gerekir. Sonra, this[string propertyName] dizinli özelliğinde Validator.TryValidateProperty yöntemini ve ValidationContext'u kullanabilirsiniz.

public class Ticket : IDataErrorInfo 
{ 
    [Required(ErrorMessage = "This field is required")] 
    [Range(1, int.MaxValue, ErrorMessage = "Only Int")] 
    public int? Tic_Id { get; set; } 

    [Required(ErrorMessage = "This field is required")] 
    public DateTime? Tic_Date { get; set; } 

    string IDataErrorInfo.Error 
    { 
     get 
     { 
      /* It can be improved */   
      return String.Empty; 
     } 
    } 

    string IDataErrorInfo.this[string propertyName] 
    { 
     get 
     { 
      Type objectType = GetType(); 
      PropertyInfo propertyInfo = objectType.GetProperty(propertyName); 
      object propertyValue = propertyInfo.GetValue(this, null); 
      List<System.ComponentModel.DataAnnotations.ValidationResult> results 
       = new List<System.ComponentModel.DataAnnotations.ValidationResult>(); 

      ValidationContext validationContext = 
       new System.ComponentModel.DataAnnotations.ValidationContext(this, null, null); 
      validationContext.MemberName = propertyName; 

      return Validator.TryValidateProperty(propertyValue, validationContext, results) ? 
       String.Empty : results[0].ErrorMessage; 
     } 
    } 
} 
+0

Teşekkür ederim, tüm çözümlerinizi çok iyi seçtim! ama sorun, varsayılan olarak doğrulama ile, sadece benim yönetim Hata ek olarak kontrolleri yapmak olduğunu! örnek olarak, bana bir ondalık nokta veya nokta engelleme ve bana bir hata mesajı söyleyerek, değer dönüştürülemez. Ama bu mesajı asla yaratmadım! nasıl çıkarırsın –

+0

@CamilleColvray kodunuz olmadan bir şey söylemek zor. Belki bu [soru] (http://stackoverflow.com/questions/6123880/how-to-handle-exception-in-value-converter-so-that-custom-error-message-can-be-d) yardımcı olabilir yeni sayın ile. Aksi halde kodunuzu postalamalısınız (belki yeni bir soruda) –

İlgili konular