2009-09-16 13 views
1

J'expérimente avec .Net RIA et Silverlight, j'ai quelques entités liées; Client, Projet et Job, un Client a de nombreux Projets, et un Projet a beaucoup de Jobs.Comment puis-je définir les valeurs initiales lors de l'utilisation de Silverlight DataForm et de .Net RIA Services DomainDataSource?

Dans l'application Silverlight, j'utilise une DomainDataSource et des contrôles DataForm pour effectuer les opérations CRUD. Lorsqu'un client est sélectionné, une liste de projets apparaît, à partir de laquelle l'utilisateur peut ajouter un nouveau projet pour ce client. J'aimerais pouvoir renseigner automatiquement la valeur pour le client, mais il ne semble pas y avoir moyen de le faire, alors qu'il existe un événement AddingNewItem sur le contrôle DataForm, il semble se déclencher avant que le DataForm ait un instance du nouvel objet et je ne suis pas sûr que le chalutage à travers le ChangeSet de l'événement DomainDataSource SubmittingChanges est le meilleur moyen de le faire.

Je pensais que cela aurait été une caractéristique évidente ... quelqu'un connaît le meilleur moyen d'atteindre cette fonctionnalité?

+0

TheDuke, vous avez trouvé la solution à votre question? J'ai une situation similaire: Je voudrais préremplir certains DataField de ma fenêtre de modèle NewItem avec certaines données d'un DataContext défini par XAML. Cela peut provenir de DataGrid ou de DataForm lui-même. Mais ni cela, ni aucune solution que j'ai essayée, ne me donne la possibilité de lier le modèle NewItem avec des données. – AlvinfromDiaspar

+0

Je n'ai pas eu beaucoup de chance avec ça et c'était juste un projet personnel de toute façon, je n'ai donc pas vraiment persévéré. Ce que j'ai fait à la fin n'est en aucun cas une solution idéale, mais en utilisant les événements AddingNewItem et EditEnded de DataForm je garde une booléenne de temps l'utilisateur ajoute un nouvel élément et puis en plus dans le gestionnaire d'événements EditEnded je détecte si l'utilisateur économise un nouvel élément utilisant ce booléen et définissez les valeurs requises de manière appropriée. Je n'ai pas testé cela complètement et mes propriétés DataForms AutoEdit et AutoCommit sont définies sur false. – TheDuke

Répondre

1

Eh bien, être en retard pour le parti, mais face à la même question que je mis en œuvre une solution de contournement à l'aide d'un convertisseur de valeur:

public class MissingDateTimeValueConverter : IValueConverter { 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
     if (value is DateTime && (DateTime)value == DateTime.MinValue) { 
      DateTime returnValue = DateTime.Now.Date; 
      int addDays; 
      if (!string.IsNullOrEmpty(parameter as string) && int.TryParse(parameter as string, out addDays)) { 
       returnValue = returnValue.AddDays(addDays); 
      } 
      return returnValue; 
     } else { 
      return value; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
     return value;    
    } 

} 

Il traduit les valeurs de date manquantes (par ex. 01.01.0001) à la date d'aujourd'hui et permet d'ajouter/soustraire des jours en utilisant le paramètre parameter.

1

Quelque chose qui est généralement fait est d'avoir un écran qui contient un DataGrid montrant les données existantes. Ensuite, avoir un bouton Ajouter qui:

  1. Créer un nouvel élément
  2. Créer un ChildWindow, passer le nouvel élément au constructeur ChildWindow
  3. Avoir un DataForm à l'intérieur du ChildWindow, lié à l'élément spécifié
+0

Cela est une option tentante, même si ma vue actuelle est le détail principal, j'ai déjà un DataForm à côté du DataGrid. Le DataForm a son propre bouton Ajouter, qui est ce que j'utilise actuellement pour ajouter un enregistrement dans la base de données. Je soulignerai la réponse comme utile, mais je ne suis pas convaincu que ce soit la seule façon d'y arriver. Toute contribution grandement appréciée. – TheDuke

1

Pour définir les valeurs par défaut lorsque mon entité est créée, j'ai ajouté une classe appelée [EntityName] .shared.cs. J'ai ensuite utilisé la technique orthographié à cette link. Ça a bien marché pour moi.

0

Cette solution vous permet d'ajouter un nouvel élément à la fin d'une collection. La collection est liée à DataForm. Avant de quitter le gestionnaire en cours, définissez DataForm.CurrentIndex comme dernier élément de la collection, puis annulez la procédure d'ajout. Le nouvel élément est initialisé/ajouté et visible dans Dataform prêt pour l'édition.

private void ResolutionDataForm_AddingNewItem(object sender, DataFormAddingNewItemEventArgs e) 
    { 
     // add a new iten in collection 
     Resolution resolution = new Resolution() { FaultName = "test" }; 
     context.Resolutions.Add(resolution); 
     //through binding the form gets updated 
     ResolutionDataForm.CurrentIndex = context.Resolutions.Count-1; 

     // cancel de current adding procedure 
     e.Cancel = true; 

    }