2012-04-02 3 views
2

Ich verwende eine Steuerelementvorlage, um Validierungsfehler auf jedem meiner Steuerelemente mithilfe des integrierten WPF-Überprüfungsmechanismus anzuzeigen, und alles funktioniert einwandfrei. Die Control sieht wie folgt aus:Wie wird die Validierungsvorlage ohne den Validierungsmechanismus verwendet?

<ControlTemplate x:Key="MyErrorTemplate" TargetType="{x:Type Control}"> 
    <StackPanel Orientation="Horizontal"> 
     <Border BorderBrush="Red" BorderThickness="2" CornerRadius="3"> 
      <AdornedElementPlaceholder Name="MyAdorner" /> 
     </Border> 
     <Image Name="imgError" 
       Source="/MyAssembly;component/Images/ValidationIcon.png" 
       ToolTip="{Binding ElementName=MyAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"/> 
    </StackPanel> 
</ControlTemplate> 

ich gelesen habe, dass der Validierungsmechanismus der validierten Steuerungs oben mit der Steuervorlage (Standard ein oder einer eigenen wie oben) wickelt, wenn die Steuerung einen Fehler bekommt.

„Wenn das WPF-Validierungssystem ein ungültiges Steuerungs erkennt es und adorner erzeugt, die eine Steuerung (...) hält, fügt eine Steuerung hinein und Sets, die Vorlage auf den Inhalt der Steuerung Validation.ErrorTemplate angebracht Eigenschaft.

Sie den adorner über der ursprüngliche Steuer positioniert, so dass der AdornedElementPlaceholder genau über der Kontrolle ist und dass sie uns leicht die Kontrolle Vorlageninhalt bezogen auf den ursprünglich control“(see more) platzieren

Wie kann ich dasselbe Verhalten für eine andere Funktion ausführen? Ich meine "MyErrorTemplate" ohne das Validierungssystem des WPF, ist das möglich?

+0

Sie für die IDataErrorInfo Schnittstelle SUCHEN ? WPF verwendet diese Schnittstelle, um Objekte zu überprüfen. (Siehe hier http://japikse.blogspot.fr/2009/07/idataerrorinfo-error-templates-and-wpf.html) –

+0

Nein, ich bin nicht.Ich möchte die zuweisen Die gleiche Validierungsvorlage zu einem Steuerelement, ohne den Validierungsmechanismus zu verwenden –

Antwort

2

Also wenn ich Sie richtig verstehe Sie wollen die gleiche Validierung schmücken Sache ohne WPF-Validierung, oder?

Der Ansatz dann ist eigentlich die Komponenten WPF Validierungssystem neu zu erstellen:

  1. erstellen Abhängigkeitseigenschaft MyCustomErrorTemplate Ihre Vorlage an die Steuer

  2. erstellen Abhängigkeitseigenschaft HasCustomError hook up zu ermöglichen zeigt den Fehler

  3. innerhalb MyCustomErrorTemplate_Changed Haken an die HasCustomError_Changed zu ermöglichen, Anzeigen/Verbergen Ihres Ado rner

  4. erstellen/die TemplatedAdorner Klasse kopieren, die dann Ihre Vorlage

zeigt, empfehle ich Ihnen, verwenden .NET Reflector oder ILSpy im folgenden Code zu sehen ein gewisses Verständnis von dem, was vor sich geht. Dies ist nicht wirklich sehr komplex oder schwer zu verstehen:

in PresentationFramework.dll:

  • System.Windows.Controls.Validation (vor allem die private static void ShowValidationAdornerHelper(DependencyObject targetElement, DependencyObject adornerSite, bool show, bool tryAgain)

  • MS.Internal.Controls.TemplatedAdorner (leider ist diese interne, also entweder Sie kopieren müssen oder eine Reflexion über sie verwenden)

+1

Es hat funktioniert. Vielen Dank! BTW ILSpy rockt! –

+0

froh ich könnte helfen =) –

0

Warum nicht? Sie können ähnliche angefügte Eigenschaften MyValidation.Errors und HasErrors haben und sie mit Ihrer benutzerdefinierten Logik füllen. Und Sie können einen Trigger haben, der ControlTemplate durch ErrorTemplate ersetzt, wenn HasError true ist. Ich denke, dass dieser einfache Ansatz das tun wird, was Sie brauchen, obwohl ich nicht ganz sicher bin, dass ich genau verstehe, dass Sie brauchen.

+0

Ich würde gerne die Vorlage verwenden, wie der Validierungsmechanismus das. Ich erstelle Kontrollen im laufenden Betrieb und ich kann keine Bindung verwenden, also würde ich gerne zuweisen ein Steuerelement mit einem Fehler (manuell validiert) markieren. –

Verwandte Themen