2

DbSet<T>.Local содержит ObservableCollection, который можно связать с элементами управления WPF. В моем случае я привязываю его к сетке.Как обрабатывать проверку в WPF при привязке к DbSet <T> .Local?

Если бы я использовал модели просмотра, я бы попросил их реализовать INotifyDataErrorInfo или IDataErrorInfo, а затем написать валидаторы Fluent Validation для проверки правильности.

Но здесь я привязываюсь к моделям через DbSet<T>.Local. Как обращаться с проверкой?

Должен ли я использовать INotifyDataErrorInfo или IDataErrorInfo на моих моделях?

Или есть альтернатива?

ответ

1

Если вы приложение, это толстый клиент, то есть все слои приложения находятся на одной физической машине, тогда вы должны реализовать IDataErrorInfo на своих моделях.

С другой стороны, если ваше приложение представляет собой тонкое многозадачное приложение, то есть ваша модель реализована на сервере, и вы используете настольное приложение WPF для связи с кодом на стороне сервера, тогда вы должны реализовать INotifyDataErrorInfo.

+0

Это мыслящий клиент.Существуют ли какие-либо альтернативы, которые не связаны с реализацией интерфейса на самих моделях? – Cocowalla

+0

@cocowalla Хорошо, потому что вы обращаетесь к этим объектам из локального кеша, я считаю, что альтернативы нет, и эта логика проверки будет привязана к классам моделей, которая считается хорошей практикой многих разработчиков, и они являются интерфейсами, поэтому вы по-прежнему можно получить из других базовых классов, если хотите. –

1

Да, я считаю, что реализация реализации IValidatableObject в моделях POCO имеет смысл. И вы, вероятно, заметили public ObservableCollection<TEntity> Local { get; }

Существует несколько способов сделать это. Так что домашнее задание.

As some background , might be useful

Then check this out

Итак, мы знаем EF имеет концепцию запуска Validations.

Configuration.ValidateOnSaveEnabled = true; 

EF также называют IEnumerable<ValidationResult> ValidateInstance();

из интерфейса IValidatableObject

если ваша организация ПОКО реализует IValidatableObject

EF инициирует проверку на СОХРАНИТЬ. Вы также можете легко запускать проверки, когда вам нужно.

Все это полностью связано с концепцией UoW.

public IEnumerable<DbEntityValidationResult> GetDbValidationErrors() { return 
     Context.GetValidationErrors(); } // Standard Context call get the problems 

, которые могут быть использованы улов (Исключение экс) {.... вар х = GetDbValidationErrors(); // ....

Так я думаю, что вы на правильном пути ...

EDIT: Добавить SAMPLE POCOBase и демонстрации проверки триггера.

public interface IFBaseObject : IValidatableObject { 
    // a POCO object must implement the VALIDATE method from IValidatableObject 
    bool IsValidInstance(); 
    IEnumerable<ValidationResult> ValidateInstance(); 

} 

public abstract class BaseObject : IFBaseObject { 

    // .... base object stuff removed.... 

    /// <summary> 
    /// Get called every a Validation is trigger on an object. Here we return and Empty resultset to start with. 
    /// If you override ALWAYS call Base first and Continue to add your own results as desired. 
    /// Never fail to call base First ! 
    /// </summary> 
    public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { 
     # region Sample implementation for a POCO thats needs validation 

     /* Sample Implementation a sub type POCO might use. 
     var validationResult = base.Validate(validationContext).ToList(); 

     if (true) // the condition that leads to a validation error 
     { 
      var memberList = new List<string> { "PropertyName" }; // the name of the offending property 
      var error = new ValidationResult("Error text goes here", memberList); // use teh textpool !!! no hardcoded texts 
      validationResult.Add(error); 
     } 

     return validationResult; 
     */ 

     # endregion 

     // now back in the base Class. 
     var validationResult = new List<ValidationResult>(); 
     // hand back a list that is empty so errors if any can be added by SUBclasses 
     // we can check any Poco that implements a certain interface centrally. 
     var thisIsKeyGuid = this as IFKeyGuid; 
     if (thisIsKeyGuid != null) { 
      if (thisIsKeyGuid.Id == Guid.Empty) { 
       validationResult.Add(new ValidationResult("Id is required", new List<string>() {"Id"})); 
      } 
     } 

     return validationResult; 
    } 

    /// <summary> 
    /// Allows explicit triggering of Validation and returns a TRUE or false answer. Call anytime 
    /// </summary> 
    /// <returns></returns> 
    public virtual bool IsValidInstance() { 
     List<ValidationResult> vResults; 
     return SelfValidation(out vResults); 
    } 

    /// <summary> 
    /// Calls Self Validation which uses THIS object as the context for validation. 
    /// This means you can trigger a validation without first declaring a validation context. 
    /// IValidatableObject is effectively called for you. Witch causes "Validate" to be called 
    /// </summary> 
    /// <returns></returns> 
    public IEnumerable<ValidationResult> ValidateInstance() { 
     List<ValidationResult> vResults; 
     SelfValidation(out vResults); 
     return vResults; 
    } 

    /// <summary> 
    /// Although SelfValidation is defined at BaseObject level, this triggers the VALIDATION process on the current Object 
    /// see http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validator.aspx for mroe details 
    /// So if a POCO Object has overridden public virtual IEnumerable of ValidationResult Validate(ValidationContext validationContext) 
    /// then this method will be called. It should of course call :base.Validate 
    /// </summary> 
    /// <returns>true or false</returns> 
    private bool SelfValidation(out List<ValidationResult> vResults) { 
     var vc = new ValidationContext(this, null, null); 
     vResults = new List<ValidationResult>(); 
     var isValid = Validator.TryValidateObject(this, vc, vResults, true); 
     return isValid; 
    } 
} 
+0

Поддерживает ли WPF документ IValidateObject? – Cocowalla

+0

не уверен, что WPF напрямую вызывает подтверждение. MVC и EF. НО, поскольку это сообщение демонстрирует, что любой крючок может вызвать вызов. Я добавлю пример того, как подключиться ... тем временем этот пост может оказаться полезным http://stackoverflow.com/questions/7121867/how-can-i-validate-multiple-properties-when-any-of -them-change –

+0

также этот http://msdn.microsoft.com/en-us/library/aa720677%28v=vs.71%29.aspx –