2010-12-09 7 views
3

Я внедрил PropertyGrid, и в нем отображаются свойства выбранного объекта (в другой библиотеке). Значения свойств привязаны к PropertyGrid элементам управления посредством привязки. Теперь я хочу выполнить проверку на значения, введенные пользователем в элементе управления PropertyGrid (в основном TextBox) и отображать сообщение пользователю, если значение неверно.Выполнение валидации в WPF PropertyGrid

Будут некоторые общие проверки, такие как числовые значения, требуемое поле и т. Д. И некоторые связанные с бизнес-логикой проверки (например, значение не может быть больше этого и т. Д.).

Какие все подходы доступны для реализации этого (IDataErrorInfo или что-то еще)?

ответ

2

Если вы уже реализовали IDataErrorInfo на ваши ViewModels, я нашел данные-шаблон, чтобы быть весьма полезными для отображения ошибок:

<Style TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Таким образом, у вас есть только установить ValidatesOnDataErrors=True на ваше TextBox переплетов и вам получить всплывающую подсказку, отображающую ошибку, если что-то не так. Это может быть применено и к другим элементам управления.

Для получения информации о том, как реализовать IDataErrorInfo правильно, смотрите здесь:
http://blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx
особенно взглянуть на раздел «3,5 Поддержка IDataErrorInfo»

+0

Спасибо, Ботц, не могли бы вы предоставить мне код о том, как вы реализовали IDataErrorInfo в своих моделях ViewModels. Фактически, в моем случае у меня есть свойства зависимостей в моих элементах управления (полученных из UserControl), мне нужно проверить эти свойства. – akjoshi 2010-12-09 10:57:53

0

Я рекомендую использовать IDataErrorInfo. Таким образом, логика проверки остается прикрепленной к ViewModel, а не к UI. И WPF имеет хорошую поддержку для этого.

1

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

using System.Collections.Generic; 
using System.ComponentModel; 
using System.Text; 

namespace ValidationExample 
{ 

    public class SomeClass : DataErrorInfoImpl 
    { 
     [CustomValidation(typeof (SomeClassValidator), "ValidateSomeTextToValidate")] 
     string SomeTextToValidate {get;set;} 

    } 

    public class SomeClassValidator 
    { 
     public static ValidationResult ValidateNumberOfLevelDivisons(string text) 
     { 
      if (text != "What every condition i want") return new ValidationResult("Text did not meet my condition."); 
      return ValidationResult.Success; 
     } 

    } 

    public class DataErrorInfoImpl : IDataErrorInfo 
    { 
     string IDataErrorInfo.Error { get { return string.Empty; } } 

     string IDataErrorInfo.this[string columnName] 
     { 
      get 
      { 
       var pi = GetType().GetProperty(columnName); 
       var value = pi.GetValue(this, null); 

       var context = new ValidationContext(this, null, null) { MemberName = columnName }; 
       var validationResults = new List<ValidationResult>(); 
       if (!Validator.TryValidateProperty(value, context, validationResults)) 
       { 
        var sb = new StringBuilder(); 
        foreach (var vr in validationResults) 
        { 
         sb.AppendLine(vr.ErrorMessage); 
        } 
        return sb.ToString().Trim(); 
       } 
       return null; 
      } 
     } 
    } 
} 

Этот стиль должен работать на WPF Xceed.PropertyGrid и WPF PropertyTools.PropertyGrid.

Смежные вопросы