Dieser Artikel wurde maschinell übersetzt.

Datenpunkte

Datenvalidierung mit Silverlight 3 und DataForm

JOHN PAPA

Erstellen stabile Silverlight-Anwendungen, die Sie bearbeiten und Überprüfen von Daten haben viel einfacher mit der Einführung des Steuerelements DataForm in Silverlight 3. Das Steuerelement DataForm enthält mehrere Features, die Formulare zu erstellen, hinzufügen, bearbeiten, löschen und Navigation durch Gruppen von Daten. Die größten Vorteile der DataForm sind seiner Flexibilität und Anpassungsmöglichkeiten Optionen.

Im Artikel dieses Monats ’s Ich zeige, wie DataForm-Steuerelement funktioniert und wie er angepasst werden kann und ich es in Aktion zeigen. Zunächst präsentieren eine Beispielanwendung, die verschiedene Features binden, navigieren, bearbeiten und Überprüfen von Daten mithilfe der DataForm verwendet. Dann durchlaufen ich die Beispielanwendung, Funktionsweise während auf die grundlegenden Anforderungen Steuerelement und sollten Anpassungen verwenden. Obwohl die DataAnnotations für die DataForm nicht erforderlich sind, können Sie die Darstellung, Validierung Aspekte und das Verhalten von der DataForm beeinflussen. Die DataAnnotations können auch eine benutzerdefinierte Überprüfung für eine Eigenschaft oder eine gesamte Entität aufzurufende Methode angeben. Ich zeige zum Implementieren der DataAnnotations auf eine Entität und zum Schreiben Ihrer eigenen benutzerdefinierten PAPAvalidation-Methoden. Gesamten Code für diesen Artikel kann von der MSDN Code Gallery (msdn.microsoft.com/mag200910DataPoints) gedownloadet werden.

Was die Endgame’s?

Bevor diving into den Code, let’s betrachten die Beispielanwendung, die die Navigation, Validierung und Bearbeitungsfunktionen von der DataForm veranschaulicht. Abbildung 1 zeigt einem DataGrid Anzeigen einer Liste der Mitarbeiter und eine DataForm, wobei jede Mitarbeiterdatensatz bearbeitet werden kann. Die Mitarbeiter im DataGrid können navigieren werden geändert, der aktuell ausgewählte Mitarbeiter wird. Der DataForm an die gleiche Gruppe von Mitarbeiter gebunden ist und erhält dieser Mitarbeiter.

Symbolleiste

Der DataForm im Bearbeitungsmodus so den Benutzer platziert wurde in Abbildung 1 gezeigte machen Änderungen und entweder speichern oder diese Abbrechen. Die Symbolleiste oben rechts von der DataForm enthält Symbole für (Bleistift) bearbeiten, einen neuen Datensatz (Pluszeichen) hinzufügen und Löschen eines Datensatzes (Minuszeichen). Diese Schaltflächen können formatiert und bei Bedarf deaktiviert werden. Der Status der Schaltflächen wird bestimmt, von der Schnittstellen implementiert, indem die Entität, während deren Sichtbarkeit durch Festlegen von Eigenschaften auf die DataForm angepasst werden kann.

Beschriftungen

Beschriftungen für jedes Textfeld in die DataForm können neben oder oberhalb des Steuerelements platziert werden. Der Inhalt der Bezeichnungen kann Metadaten datengesteuerten mithilfe des Attributs Anzeige DataAnnotations sein. Die DataAnnotations-Attribute werden auf die Eigenschaften der Entität, in diesem Fall die Entität Mitarbeiter platziert dabei helfen Sie feed die DataForm Informationen, wie der Text, in das Feldbeschriftungen angezeigt.

DescriptionViewer

Wenn die DataForm im Bearbeitungsmodus (wie dargestellt in Abbildung 1) befindet, kann der Benutzer Hovern Sie über das Symbol neben der Beschriftung neben jedem Textfeld-Steuerelement, um eine QuickInfo anzuzeigen, die weitere darüber Informationen, was in das Feld eingeben. Dieses Feature wird von der DataForm implementiert, wenn Sie ein DescriptionViewer-Steuerelement neben das gebundene Textfeld-Steuerelement einfügen. In der QuickInfo die DescriptionViewer angezeigte Text ist auch aus dem DataAnnotations anzeigen Attribut eingezogen.


Abbildung 1 Überprüfung und Bearbeiten mit dem DataForm

Abbrechen und übernehmen

Die Abbrechen-Schaltfläche am unteren Rand der DataForm ist im Bearbeitungsmodus aktiviert. Die Schaltfläche im Bearbeitungsmodus aktiviert ist und ein Benutzer einen Wert in der DataForm ändert. Der Text und Stile für diese Schaltflächen können angepasst werden.


Abbildung 2 DataForm außerhalb des Feld

Validierung Notification

NotificationThe DataForm in diesem Beispiel wird in den Status bearbeiten angezeigt, in denen der Benutzer eine ungültige e-Mail-Adresse und Telefonnummer eingegeben wurde. Beachten Sie, dass Feldbeschriftungen für die Felder ungültig, in Rot sind und die Textfelder werden in Rot mit einem roten Flag in der oberen rechten Ecke umrahmt. Wenn ein Benutzer den Cursor in ein Steuerelement für ungültig erklärten versetzt, wird eine QuickInfo mit einer Nachricht beschreiben, was hat zur Behebung des Problems durchgeführt werden angezeigt. Abbildung 1 zeigt auch eine Liste der Validierungsfehler am unteren Rand des Bildschirms. Alle diese Features werden vom DataForm und DataAnnotations unterstützt und können benutzerdefinierte Formatvorlagen verwenden, um ein benutzerdefiniertes Aussehen und Verhalten verleihen. Die Validierungsregeln sind aus mehreren DataAnnotations an vorkonfigurierte Regeln, wie erforderliche Felder oder benutzerdefinierten Regeln eingezogen.

Der DataForm entwerfen

Der DataForm, in das Silverlight-Toolkit gefunden kann zu einem Projekt einmal die Assembly hinzugefügt werden, die System.Windows.Controls.Data.DataForm.Toolkit.dll verwiesen wurde. Der DataForm kann mit sehr wenig Setup erstellt werden. Einmal auf der Entwurfsoberfläche in Blend gezogen oder in XAML erstellt, indem Sie einfach die ItemsSource der DataForm auf eine Sammlung von Entitäten festlegen – die DataForm generiert automatisch die Felder anzeigen und aktivieren dann entsprechende Bearbeitungsfunktionen. Das folgende XAML generiert die DataForm im Abbildung 2 angezeigt:

<dataFormToolkit:DataForm x:Name="dataForm" ItemsSource="{Binding Mode=OneWay}" />

Hinweis: Der Bindungsmodus ist nur für explizite Zwecke zu OneWay im vorherigen Beispiel festgelegt. Es ist nicht erforderlich. Allerdings hilfreich ich es für die Klarheit und Unterstützbarkeit den Bindungsmodus explizit festgelegt.

Zusätzliche Einstellungen können zu DataForm um seine Funktionalität zu verfeinern angeschlossen werden. Allgemeine Einstellungen beinhalten im Abbildung 3 angezeigt:

Abbildung 3 allgemeine DataForm Anpassungen

Häufig ist es vorteilhaft, style-’s DataForm visuelle Features, um mit die visuelle Darstellung der Anwendung zu koordinieren. Verwenden von Ressourcen im Dokument, app.xaml oder ein Ressourcenverzeichnis können verschiedene Aspekte der DataForm formatiert werden. Von Expression Blend im Abbildung 4 im partiellen Screenshot dargestellt sind mehrere Formatvorlagen, die festgelegt werden können. Beachten Sie, dass die CancelButtonStyle und die CommitButtonStyle auf einen Wert festgelegt werden. Dies ist wie den Schaltflächen blaue Darstellung bietet wie in der unteren Bildschirmrand im Abbildung 1 dargestellt. Der DataForm selbst kann durch Festlegen der Style-Eigenschaft formatiert werden. Einzelne Aspekte der DataForm, z. B. die DataField oder ValidationSummary, können auch formatiert werden.

Durch das Festlegen einiger diese häufigeren Eigenschaften der DataForm sowie einige grundlegenden Formatvorlagen, erreichen wir die Darstellung und Funktionalität in Abbildung 1 angezeigt. Die Einstellungen für die Beispielanwendung in diesem Artikel enthalten sind in Abbildung 5 dargestellt. Beachten Sie, dass AutoEdit und AutoCommit beide auf False festgelegt festgelegt werden, daher erfordert, dass die DataForm explizit in den Bearbeitungsmodus durch den Benutzer auf die Schaltfläche Bearbeiten klicken, auf der Symbolleiste eingefügt werden und dass der Benutzer die Schaltfläche Speichern der Änderungen klicken.


Abbildung 4 Styling DataForm-

Die Navigationsschaltfläche wird aus der CommandButtonsVisibility-Eigenschaft weggelassen, was bedeutet, dass die Symbolleiste nicht die Navigationsbereich-Optionen angezeigt wird. Wenn wir diese Option indem Sie die CommandButtonsVisibility das Schlüsselwort Navigationsbereich hinzufügen oder indem Sie die Einstellung auf das Schlüsselwort beinhalten alle, die DataForm auch die Symbolleiste Navigationsschaltflächen anzeigen würde. Da die Schaltflächen übernehmen und Abbrechen in der CommandButtonsVisibility-Eigenschaft enthalten sind, werden diese angezeigt. Während der DataForm noch nicht bearbeitet wurde, wird die Schaltfläche Abbrechen wie dargestellt in Abbildung 6 deaktiviert. Die Navigationsschaltflächen ermöglichen dem Benutzer, um die Auflistung der Datensätze zu bewegen. Allerdings können in dieser Beispielanwendung die Benutzer auch navigieren mittels datengebundenen DataGrid, da es auch dieselbe Menge von Daten wie die DataForm gebunden ist. Daher deaktiviert ich die Navigationsschaltflächen in der Symbolleiste lediglich als eine Entwurfsentscheidung, da die Navigationsfunktionen bereits über das DataGrid erreicht werden kann.

DataAnnotations

Ein Großteil der Funktionalität von der DataForm wird gesteuert durch die DataAnnotations-Attribute an die DataForm datengebunden Entität platziert. Die DataAnnotations sind verfügbar, nachdem Sie die System.ComponentModel.DataAnnotations.dll Assembly verweisen. Der DataForm untersucht die Attribute und entsprechend angewendet. Abbildung 7 zeigt mehrere DataAnnotations-Attribute, die-Eigenschaften einer Entität ergänzen können und beschreibt ihre Auswirkung.

Abbildung 5 DataForm- anpassen

<dataFormToolkit:DataForm x:Name="dataForm"
                 ItemsSource="{Binding Mode=OneWay}"
                 BorderThickness="0"
                 FontFamily="Trebuchet MS" FontSize="13.333"
                 CommitButtonContent="Save"
                 CancelButtonContent="Cancel"
                 Header="Employee Details"
                 AutoEdit="False"
                 AutoCommit="False"
                 AutoGenerateFields="True"
                 CommandButtonsVisibility="Edit, Add, Delete, Commit, Cancel"
                 CommitButtonStyle="{StaticResource ButtonStyle}"
                 CancelButtonStyle="{StaticResource ButtonStyle}"
                 DescriptionViewerPosition="BesideLabel"
                 LabelPosition="Left" />

Das Attribut Display feeds Label und DescriptionViewer ’s DataForm mit den Parametern Name und Beschreibung bzw.. Wenn nicht angegeben, generiert der DataForm automatisch diese Werte für die Steuerelemente mit dem Namen der der Eigenschaft. Beachten Sie in acht, dass die Mitarbeiter Entität ’s FirstName-Eigenschaft mit 3 DataAnnotations Attribute ergänzt ist. Das Anzeige-Attribut gibt, dass die Bezeichnung Text “ Vorname eingeben angezeigt sollte und die DescriptionViewer, eine QuickInfo “ ’s Mitarbeiter Vorname eingeben anzeigen sollte.

Das erforderliche Attribut gibt an, dass ein Wert für die Eigenschaft Vorname eingegeben werden muss. Das erforderliche Attribut, wie alle Validierung Attribute akzeptiert einen ErrorMessage-Parameter. Der ErrorMessage-Parameter gibt die Meldung, die in einer QuickInfo für das Steuerelement für ungültig erklärten und in das ValidationSummary-Steuerelement in der DataForm angezeigt werden. Das StringLength-Attribut für die FirstName-Eigenschaft ist festgelegt, um anzugeben, dass das Feld 40 Zeichen lang sein höchstens darf und wenn dies der Fall ist, wird eine Fehlermeldung angezeigt.

Der Code im acht zeigt, dass wenn ein Wert der Eigenschaft festgelegt ist, die Validate-Methode aufgerufen wird. Überprüfung ist eine Methode in Basisklasse ModelBase erstellten für alle Entitäten in diesem Beispiel verwendet. Diese Methode überprüft die Eigenschaft, indem es für alle seine Attribute DataAnnotations überprüfen. Wenn einer von Ihnen fehlschlägt, löst eine Ausnahme aus, die-Eigenschaft nicht auf den ungültigen Wert fest und weist der DataForm um den Benutzer zu benachrichtigen. Abbildung 1 zeigt die Ergebnisse der leeren Feld Vorname, da er erforderlich ist.

Validate-Methode der ModelBase-Klasse ’s wird in jede Eigenschaftensetter-aufgerufen, damit jede Eigenschaft wenn überprüft werden kann. Die Methode akzeptiert den neuen Wert und der Name der Eigenschaft, die validiert wird. Diese Parameter werden wiederum Validator-Klasse ’s ValidateProperty-Methode, übergeben die tatsächliche Validierung auf der Wert der Eigenschaft:

protected void Validate(object value,
string propertyName) {
Validator.ValidateProperty(value,
new ValidationContext(this, null, null) {
MemberName = propertyName });
}

Die Verifizierung ist eine statische Klasse, die Sie Validierung mithilfe der mehrere verschiedene Verfahren ausführen kann:

  • Die ValidateProperty-Methode überprüft eine einzelne Eigenschaft Werte und DataAnnotations.ValidationException löst, wenn der Wert ungültig ist.
  • Die ValidateObject-Methode überprüft alle Eigenschaften auf die gesamte Entität und DataAnnotations.ValidationException löst, wenn jeder Wert ungültig ist.
  • Die TryValidateProperty-Methode führt dieselben Validierungen als ValidateProperty, außer es einen booleschen Wert anstelle des Auslösen einer Ausnahme zurückgibt.
  • Die TryValidateObject-Methode führt dieselben Validierungen als ValidateObject, außer es einen booleschen Wert anstelle des Auslösen einer Ausnahme zurückgibt.
  • Die ValidateValue-Methode akzeptiert einen Wert und eine Auflistung von Validierung Attributen. Wenn der Wert eines der Attribute fehlschlägt, wird eine ValidationException ausgelöst.
  • Die TryValidateValue-Methode führt dieselben Validierungen als ValidateValue, außer dass Sie einen booleschen Wert anstelle des Auslösen einer Ausnahme zurückgibt.

Abbildung 7 allgemeine DataAnnotations

Abbildung 8 FirstName-Eigenschaft mit DataAnnotations

private string firstName;
[Required(ErrorMessage = "Required field")]
[StringLength(40, ErrorMessage = "Cannot exceed 40")]
[Display(Name = "First Name", Description = "Employee's first name")]
public string FirstName
{
get { return firstName; }
set
{
if (firstName == value) return;
var propertyName = "FirstName";
Validate(value, propertyName);
firstName = value;
FirePropertyChanged(propertyName);
}
}

Ich erstellte auch eine Methode in der ModelBase-Klasse mit dem Namen IsValid, die die TryValidateObject--Methode, aufruft wie unten dargestellt. Diese Methode kann jederzeit um festzustellen, ob es in einem gültigen Status ist auf der Entität aufgerufen werden:

public bool IsValid() {
return Validator.TryValidateObject(this,
new ValidationContext(this, null, null),
this.validationResults, true);
}

Abbildung 9 benutzerdefinierten Eigenschaft Validierung

public static class EmployeeValidator
{
public static ValidationResult ValidateAge(int age)
{
if (age > 150)
return new ValidationResult("Employee's age must be under 150.");
else if (age <= 0)
return new ValidationResult(
"Employee's age must be greater than 0.");
else
return ValidationResult.Success;
}
}

Benutzerdefinierte Validierung

Ein vorkonfigurierte Attribut aus dem Satz von DataAnnotations nicht ausreichend ist, können erstellen Sie eine benutzerdefinierte Validierung-Methode und ein gesamtes Objekt oder einen Eigenschaftenwert angewendet. Die Validierungsmethode muss statisch sein und ein ValidationResult-Objekt zurückzugeben. Das ValidationResult-Objekt ist das Fahrzeug, das die Nachricht enthält, die an die DataForm gebunden werden soll. Abbildung 9 zeigt die benutzerdefinierte Gültigkeitsprüfung-Methode von ValidateAge, die überprüft, ob der Wert zwischen 0 und 150. Dies ist ein einfaches Beispiel, und ein Range-Attribut konnte verwendet wurden. Ermöglicht jedoch eine bestimmte Methode erstellen, um durch mehrere Entitäten für die Validierung wiederverwendet werden.

Benutzerdefinierte Überprüfung Methoden können auch erstellt werden, um ein gesamtes Objekt zu überprüfen. Die ValidateEmployee-Methode akzeptiert die gesamte Entität Mitarbeiter und untersucht verschiedene Eigenschaften bestimmen, ob die Entität in einem gültigen Zustand befindet. Dies ist zum Erzwingen von Entität Gültigkeitsregeln sehr hilfreich, wie unten dargestellt:

public static ValidationResult ValidateEmployee(Employee emp) {
string[] memberNames = new string[] { "Age", "AnnualSalary" };
if (emp.Age >= 50 && emp.AnnualSalary < 50000)
return new ValidationResult(
"Employee is over 50 and must make more than $50,000.",
memberNames);
else
return ValidationResult.Success;
}

Das Steuerelement Zusammenfassung der Validierung wird durch die DataForm angezeigt, wenn eine oder mehrere ValidationExceptions ausgelöst werden (siehe Abbildung 10). Der Name des Feldes wird in fett lettering, während die Validierungsmeldung daneben angezeigt wird hervorgehoben. Der Stil für das ValidationSummary kann auch mit eine Ressource angepasst werden, bei Bedarf.


Abbildung 10 Überprüfung Zusammenfassung

Influencers

Der DataForm nimmt seine Hinweis aus DataAnnotations sowie von den Schnittstellen, die die gebundenen Datenquelle implementiert. Die Mitarbeiter Entität implementiert beispielsweise die IEditableObject-Schnittstelle. Diese Schnittstelle erzwingt die Implementierung der BeginEdit, CancelEdit und EndEdit-Methoden, die durch die DataForm entsprechenden Zeiten aufgerufen werden, während die DataForm bearbeitet wird. In der Beispielanwendung verwendet habe ich diese Methoden, um ein Abbrechen-Verhalten implementieren, damit der Benutzer über die Schaltfläche Abbrechen und die ursprüngliche Entität Werte wiederherstellen kann.

Dieses Verhalten wird durch eine Instanz der Entität in der BeginEdit-Methode (benannte Cache) erstellen und kopieren die ursprünglichen Werte aus der Entität erreicht. Die EndEdit-Methode löscht das Cache-Objekt, während die CancelEdit-Methode kopiert alle Werte Formular die Cache-Entität auf die ursprüngliche Entität daher den ursprünglichen Zustand wiederherstellen sichern.

Wenn die DataForm sieht, dass die Auflistung, der es gebunden ist eine CollectionViewSource ist, unterstützt es bearbeiten, sortieren, Filtern und verfolgen den aktuellen Datensatz (auch bekannt als Währung). Die Währung-Funktion ist wichtig, wie stellt auch sicher, dass die DataForm keinen Benutzer eine ungültige Entität Zustand verlassen ohne beheben und ein Commit oder die Änderungen abbrechen zulässt. Binden der DataForm an einem PagedCollectionView auch bietet diese dieselben Features und bietet auch das Löschen eines Elements, Hinzufügen eines Elements und Gruppieren von Elementen. Bindung an eine ObservableCollection deaktiviert einige dieser Features wie eigenständig die ObservableCollection nicht die Schnittstellen implementiert, die die DataForm sucht.

Wenn Ihre Entitäten bereits in ein ObservableCollection-Objekt enthalten sind, können Sie ein PagedCollectionView erstellen durch Übergabe der ObservableCollection-Instanz in die Auflistung über seinen Konstruktor wie unten dargestellt:

var employees = new DataService().GetPeople();
PagedCollectionView view = new PagedCollectionView(employees);
this.DataContext = view;

Alternativ können Sie eine CollectionViewSource erstellen durch das Übergeben der ObservableCollection von Mitarbeitern in ’s CollectionViewSource Auflistungsinitialisierer und Festlegen der Source-Eigenschaft, wie unten dargestellt:

var employees = new DataService().GetPeople();
CollectionViewSource view = new CollectionViewSource
{Source = employees};
this.DataContext = view;

Zusammenfassung

Der DataForm fügt viel Wert auf Anwendungen und der Prozess normalerweise Code stark beanspruchen und monotonous des navigieren, bearbeiten und Anzeigen von Daten. Seine Funktionen sind an Ihre Bedürfnisse angepasst, und es kann in Ihrem Anwendungsentwurf ’s ineinander visuell formatiert werden.

John Papa (johnpapa.net) ist leitender Berater und ein Fan Baseball, für die Yankees mit seiner Familie rooting Sommer Nächte anfeuert. Papa, ein Silverlight-MVP, Silverlight Insider und INETA-Sprecher, hat mehrere Bücher, einschließlich seine neuesten verfasst “ datengesteuerter Services mit Silverlight 2 eingeben (O’Reilly, 2009). Er spricht oft auf Konferenzen wie VSLive!, DevConnections und MIX.