2010-12-09 8 views
3

Ich habe eine PropertyGrid implementiert und Eigenschaften des ausgewählten Objekts (in einer anderen Bibliothek) werden darin angezeigt. Eigenschaftswerte sind durch Bindung an PropertyGrid Steuerelemente gebunden. Jetzt möchte ich die Werte überprüfen, die der Benutzer in die PropertyGrid Steuerung eingibt (hauptsächlich TextBox) und dem Benutzer eine Meldung anzeigen, wenn der Wert nicht korrekt ist.Implementierung von Validierungen in WPF PropertyGrid

Es gibt einige allgemeine Validierungen wie numerische Werte, Pflichtfeld usw. und einige Business-Logik-bezogene Validierungen (wie Wert kann nicht mehr sein als dies etc.).

Welche Ansätze gibt es, um dies zu implementieren (IDataErrorInfo oder etwas anderes)?

Antwort

2

Wenn Sie bereits IDataErrorInfo auf Ihrem Viewmodel umgesetzt haben, ich dieses Daten-Template gefunden für die Anzeige von Fehlern sehr nützlich zu sein:

<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> 

Auf diese Weise haben Sie nur ValidatesOnDataErrors=True auf Textbox Bindungen zu setzen und Sie Erhalten Sie einen Tooltip, der den Fehler anzeigt, wenn etwas nicht stimmt. Dies kann auch auf andere Steuerelemente angewendet werden.

Informationen darüber, wie IDataErrorInfo richtig zu implementieren, hier:
http://blogs.msdn.com/b/wpfsdk/archive/2007/10/02/data-validation-in-3-5.aspx
insbesondere einen Blick auf den Abschnitt haben „3.5 IDataErrorInfo Unterstützung

+0

Dank Botz, können Sie mir bitte einen Code zur Verfügung stellen, wie Sie IDataErrorInfo in Ihren ViewModels implementiert haben. Tatsächlich in meinem Fall habe ich Abhängigkeitseigenschaften in meinen Steuerelementen (abgeleitet von UserControl), muss ich diese Eigenschaften überprüfen. – akjoshi

+0

Ich habe einen Link hinzugefügt, wo Sie sehen können, wie Sie es implementieren. – Botz3000

+0

Ich habe diesen Artikel gestern gesehen, aber ich bin verwirrt darüber, wie IDataErrorInfo mit Inherited-Steuerelementen implementiert wird. Ich habe ein BaseControl (mit einigen gemeinsamen Abhängigkeitseigenschaften) und meine Steuerelemente sind geerbt von diesem Basissteuerelement und haben einige andere Abhängigkeitseigenschaften. Ich muss Validierungen für alle Abhängigkeitseigenschaften (Eltern + Kind) durchführen. – akjoshi

0

Ich empfehle die Verwendung IDataErrorInfo. Auf diese Weise bleibt die Validierungslogik an ViewModel gebunden und nicht an die . Und WPF hat auch gute Unterstützung dafür.

1

Vor kurzem hatte ich mit diesem Problem fertig zu werden, so werde ich Poste diesen Beispielcode, um anderen mit dem gleichen Problem zu helfen.

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; 
      } 
     } 
    } 
} 

Dieser Stil sollte auf WPF Xceed.PropertyGrid und WPF PropertyTools.PropertyGrid arbeiten.