7
votes

Comment définir le DataContext d'un contrôle utilisateur

J'écris une application dans WPF, à l'aide de la boîte à outils MVVM et posez des problèmes de connexion de la vue et de la vue.

Le modèle est créé avec ADO.NET Entity Framework. P>

La vue : p> xxx pré>

et la vue (aucun code derrière le moment): p> xxx pré>

et dataaccesslayer classe: p >

 class DataAccessLayer
    {
        public List<Customer> customers = new List<Customer>();

        public static List<Customer> getcustomers()
        {
            entities db = new entities();

            var customers = from c in db.Customer.Include("Orders")
                           select c;
            return customers.ToList();
        }


    }


2 commentaires

Dans votre code, vous avez une propriété AllCustomers sur votre modèle de vue, mais vous lissez pour les clients.


Je nettoyais légèrement le code et je faisais une faute de frappe. La liaison dans le code de travail est bien sûr correcte.


3 Réponses :


0
votes

est Ce ce que vous cherchez pour?


5 commentaires

Oui et non. J'ai besoin d'appeler la méthode getcustomers (). Devrais-je le faire dans un constructeur de menu de vie? Ne semble pas très bon.


Personnellement, j'aurais l'appel de mention de vue GetCustomers () dans le constructeur. Que pensez-vous n'est pas bon à ce sujet? Lorsque l'affichage rend une nouvelle instance de la viewModel et à ce point, vous souhaitez que les données soient récupérées, il est donc logique que le constructeur le fasse.


Qu'en est-il de la construction XAML dans les ressources?


Le seul problème majeur avec la déclaration de l'objet dans le XAML est que toute erreur projetée pendant la construction VM sera consommée par une erreur d'analyse XAML. Nous nous sommes éteints pour utiliser un DI comme MEF pour avoir injecté la machine virtuelle dans le DataContext de la vue à la charge. Onload peut incendier plusieurs fois alors assurez-vous de vous couper le court-circuit avec un champ chargé ou quelque chose de similaire.


Oui c'est une meilleure solution à utiliser di à coup sûr. Bon commentaire!



5
votes

Étant donné que cela utilise le paradigme MVVM, j'inspire votre viewModel dans le constructeur pour la vue. Mes images de vue / views suivent généralement cette séquence d'événements:

  1. la vue est instanciée li>
  2. Afficher les instances de constructeur viewModel Li>
  3. ViewModel Initialise Li>
  4. viewModel exécute des procédures d'obtention de données (thread séparé) li>
  5. ViewModel appelle ONPROPERTYCHANGED ("") Alert Alert View que quelque chose a changé; Vérifiez tout li> ol>

    My ViewModel est instancié à partir du XAML CodeBeHind (Désolé, c'est dans VB.Net, vous n'avez pas eu d'abord d'apprendre C # assez bien pour me faire confiance): P>

    <UserControl>
        <UserControl.DataContext>
            <Local:EditShipmentViewModel>
        </UserControl.DataContext>
    </UserControl>
    


3 commentaires

C'est le contraire de MVVM.


@Edplunkett Vous êtes totalement bienvenu pour poster une réponse.


C'est l'un des anti-modèles les plus courants du WPF. Vous ne devriez pas encourager les débutants à utiliser des anti-motifs qui leur causeront des problèmes et de la frustration.



0
votes

Je fixe mon point de vueModel DataContext de la même manière que j'ai observé Blend4 à. C'est-à-dire que si mon point de vue est appelé MainviewModel, je le référenne dans la vue comme: xxx

En outre, si vous chargez des données d'une base de données dans le constructeur de votre viewModel, ne faites pas Oubliez d'ajouter une méthode d'assistance autour de lui comme: xxx

de sorte que Visual Studio / Blend4 ne s'effondre pas d'essayer de récupérer les données de la connexion de la base de données dans le concepteur. Je charge personnellement des données dans le constructeur assez souvent, juste parce que j'en ai besoin tout de suite, et car il doit être mis en cache en mémoire du démarrage.

:)


0 commentaires