2010-01-26 24 views
2

Nous étudions comment créer des vues de saisie de données à partir d'une liste dynamique de définitions de champs prédéfinies. Par "prédéfini", je veux dire qu'il n'y a que 8 types de champs de base. Le contrôle DataForm de Silverlight Toolkit est presque ce que vous voulez, mais il cible l'objet propriétés (pas une liste de définitions personnalisées).Formulaires de saisie de données dynamiques dans Silverlight

Existe-t-il un projet existant pour faciliter cette tâche? S'il vous plaît commenter mon idée de conception (ci-dessous). J'ai seulement ~ 2 semaines d'expérience Silverlight.

idée de conception de base:

Je pense à la définition des types de champs de données personnalisés. Un IEnumerable<BaseDataField> sera reçu par l'interface utilisateur, énuméré, et les contrôles seront créés en fonction du type de chaque champ. Chaque champ crée une étiquette avec la description et BooleanDataField va créer un CheckBox, LookupDataField va créer une zone de liste déroulante, etc.

Pseudo code pour clarifier l'idée:

public abstract class BaseDataField { 
    public string FieldCode { get; private set; } 
    public string FieldDescription { get { return FieldDefinitions.Instance.FieldDescription(FieldCode); } } 
    ... 
} 

public class StringDataField : BaseDataField 
public class BooleanDataField : BaseDataField 
public class CurrencyDataField : BaseDataField 
public class IntegerDataField : BaseDataField 
public class NumericDataField : BaseDataField 
public class DateTimeDataField : BaseDataField 
public class LookupDataField : BaseDataField 
public class SpecialDataField : BaseDataField 

Ce sera étendu pour rendre les champs liable; permet de spécifier des contrôles personnalisés pour chaque type; et avoir des commentaires de validation. Peut-on le faire facilement dans Silverlight ou devrions-nous créer un contrôle personnalisé?

Remarque: Ce programme sera une interface utilisateur Web pour une plate-forme LOB existante à plusieurs niveaux. Toutes les données sont sérialisées à partir d'un service REST basé sur JSON.

Merci!

+0

Vous dites que vous avez seulement 2 semaines d'expérience Silverlight, mais combien d'expérience .NET avez-vous? Il a tendance à bien se traduire. Je suggère d'ajouter 'abstract public Type FieldType {get; } '' BaseDataField', puisque c'est probablement une information utile à avoir. –

+0

J'ai 2-3 ans d'expérience .NET 2.0 et un MCPD. XAML, les contrôles Silverlight et les modèles de liaison sont très nouveaux pour moi.Merci pour la suggestion. – carlmon

Répondre

0

Nous avons commencé avec DataForm, mais nous avons fini par surcharger tout ce qui le rend utile et qui a encore quelques problèmes. J'ai appris beaucoup de la tentative et finalement construit un contrôle personnalisé pour le travail. Malheureusement cette solution n'est pas très extensible ...

2

Je recommande fortement d'incorporer la classe DataForm dans votre solution et elle est en effet capable de gérer des contrôles personnalisés. J'ai poursuivi cet objectif d'un formulaire de données minimal-xaml idéal pendant des années et je me suis finalement arrêté sur ce que je pense être une excellente combinaison de la fonctionnalité intégrée de DataForm et des champs personnalisés dérivés de DataField. Par exemple, je viens d'étendre DataField de sorte que lorsqu'aucune propriété Content n'est spécifiée, elle utilise automatiquement un TextBox qui minimise mon temps XAML. J'ai également ajouté le support pour le DisplayFormatAttribute que DataForm ne semble pas prendre en charge de manière native.

Quoi qu'il en soit, vous pouvez tout d'abord créer un ensemble de sous-classes comme décrit ci-dessus et dériver de DataField. Ensuite, dans la méthode OnApplyTemplate, créez un élément pour représenter les données. Par exemple:

class BooleanDataField : DataField { 

    protected override void OnApplyTemplate() { 

     if (this.Content == null) { 
      var check = new CheckBox(); 
      check.SetBinding(CheckBox.IsCheckedProperty, 
       new Binding(this.PropertyPath)); 
      this.Content = check; 
     } 

     base.OnApplyTemplate(); 
    } 

} 

En ce qui concerne la façon d'obtenir vos métadonnées sur le terrain chargé par DataForm, vous avez quelques options. Vous pouvez gérer l'événement AutoGeneratingField et rechercher le champ approprié à utiliser à la volée ou vous pouvez désactiver la génération automatique du champ et le charger simplement avec le vôtre.

+0

Est-il possible d'utiliser la génération automatique pour une liste dynamique de champs? Nous avons un outil permettant aux utilisateurs de créer et de lier des champs personnalisés aux produits. DataForm.GenerateFields() semble générer uniquement des champs à partir de propriétés de type complexes. Merci pour votre recommandation. J'étudierai la population de DataForm manuelle w/binding et marquera votre réponse comme acceptée si cela fonctionne. – carlmon

+0

Cette option semble très intéressante, j'aimerais voir comment tout irait ensemble. –