2008-09-25 3 views
5

Wir verwenden die Standardmethode für unsere Kontrollen, um gebrochene BO-Regeln zu melden. Dies geschieht über die Schnittstelle IDataError in unseren BOs und in XAML ist das Steuerelement an die BO-Eigenschaft usw. gebunden. Diese Vorgehensweise funktioniert in Ordnung. Aber wir müssen 2 Arten von Visualisierungen in der Benutzeroberfläche anzeigen, abhängig vom Typ (oder der Kategorie, wenn Sie möchten) des Ungültigkeitsfehlers. Wenn es ein Pflichtfeld ist, zeigen wir einen CueBanner (Wasserzeichen), aber bei anderen Typen ändern wir die Farbe der Steuergrenze. In beiden Szenarien legen wir den Werkzeugtyp der Fehlermeldung fest.Ist dies ein verrückter Weg, um mehrere Validierungstypen mit IDataError und WPF zu behandeln?

Das Problem mit IDataError ist, dass es keine Methode/Eigenschaft unterstützt, um zwischen Fehlertypen zu unterscheiden.

Die einzige Möglichkeit, die ich tun kann, besteht darin, den Fehlertext zu untersuchen, erforderlicher Feldtext muss das Schlüsselwort "erforderlich" enthalten. Der folgende Ansatz fühlt sich nicht richtig an, aber es ist der einzige Weg, wie ich die Art des Fehlers bestimmen und dann entsprechend behandeln kann. Alle erforderlichen Feldregeln müssen als Teil des Fehlertexts "erforderliches Feld" enthalten sein. Um dies alles funktionieren zu lassen, habe ich eine benutzerdefinierte Abhängigkeitseigenschaft namens ErrorMessage erstellt. In meinem ResourceDictionary habe ich einen Style.Trigger für Validation.HasError. Dort habe ich den Wert meiner Abhängigkeitseigenschaften auf den ErrorContent gesetzt. Jetzt, wenn sich der Wert meiner Abhängigkeitseigenschaften ändert, kann ich den Text untersuchen und die Validation.SetErrorTemplate (myControl, newErrorTemplate) entsprechend dem Fehlertyp auf die Vorlage setzen. Ich muss ein paar Ereignisse an die Steuerung übertragen, wie zum Beispiel "lost", und den Fokus auf das Entfernen oder Hinzufügen der cueBanner-Vorlage richten, aber die ganze Sache wird funktionieren. Ich bin mir nur nicht sicher, ob das der beste Weg ist.

PS. Wenn ich das ErrorTemplate setze, mache ich das im Code, der das baut und hinzufügt. Gibt es eine Möglichkeit, Validation.SetErrorTemplate auf eine statische Ressource zu verweisen, wobei zu beachten ist, dass ich zwischen mindestens zwei Typen wechseln muss? bitte

Ihre Gedanken ..

Antwort

3

Wäre es möglich, eine Schnittstelle IDataError abzuleiten, die eine zusätzliche Eigenschaft hinzufügt, die eine Aufzählung der Fehlertyp ist. Dann könntest du versuchen, dagegen zu binden.

+0

Ich glaube nicht, dass die zusätzliche Eigenschaft von der Fehler-Vorlage aus zugänglich ist. Der DataContext der ErrorTemplate ist die Validation.Errors-Auflistung. –

0

Wenn Sie mit einem (ungetesteten) Ansatz zufrieden sind, der ein wenig an Klarheit leidet, können Sie Folgendes tun: Eine Ausnahme auslösen, anstatt eine Zeichenfolge mit der IDataErrorInfo-Schnittstelle zurückzugeben. In Ihrer ErrorTemplate können Sie auf die ValidationErrors (und die ValidationError.Exception-Eigenschaft) zugreifen.

Dann verwenden Sie einen DataTrigger für die Ausnahme in Kombination mit einem Konverter, der nach dem richtigen Exception-Typ sucht und true oder false zurückgibt. Es sollte genug sein, um den Job zu erledigen.

Verwandte Themen