7
votes

Quelle est la meilleure façon de partager des données entre une fenêtre WPF et ses contrôles utilisateur?

WPF peut être en train de s'exécuter parfois.

J'ai une application assez simple qui consiste en une seule fenêtre principale contenant une commande de tabulation et plusieurs onglets. Je n'ai pas aimé l'idée d'avoir le code pour tous les onglets dans le même fichier, alors j'ai utilisé la réponse de Cette question pour séparer chaque onglet dans un contrôle d'utilisateur distinct.

Dans ma fenêtre principale, j'ai une instance d'un objet contenant des paramètres d'application et d'autres données à l'échelle de l'application. Plusieurs de mes onglets nécessitent accès à ces données à des fins de liaison des données. Je n'ai pas pu trouver un bon moyen d'accomplir cela.

J'ai d'abord essayé d'accéder à la fenêtre mère dans l'événement chargé des commandes et d'obtenir une référence à la propriété dans la fenêtre principale qui a exposé l'objet de paramètres. , comme indiqué dans le code ci-dessous. Ce type de fonctionne, à l'exception de l'événement chargé, est tiré à chaque fois que l'onglet gagne la mise au point. En outre, cet événement se produit tard dans le cycle de la vie de contrôle, donc je ne suis pas capable de se lier à aucune des propriétés de cet objet dans la commande utilisateur xaml. xxx

alors j'ai expérimenté en faisant passer les données dans le constructeur des contrôles de l'utilisateur, mais il n'ya aucun moyen de le faire dans xaml.

étant donné que ce sont des paramètres à l'échelle de l'application, je pouvais faire la classe d'applications Singleton et le référer partout, mais je préférerait ne pas faire cela à des fins de test de l'unité.

Alors, comment accomplir quelque chose comme ça? Mon approche est-elle juste fondamentalement défectueuse? Dans mon esprit, tous ces éléments de l'interface utilisateur font partie de la même fenêtre et devraient donc pouvoir accéder aux données de la fenêtre principale, mais le modèle d'objet n'apparaît pas permettre cela.


0 commentaires

3 Réponses :


2
votes

Vous pouvez mettre l'objet Paramètres dans une propriété statique dans une classe wrapper ( titulaire de paramètres code> dans cet exemple et référencer l'application de l'écran via

dans xaml: p> xxx

avec local code> étant l'espace de noms de votre Paramètres code> classe est dans. p>

en code: p>

var x = SettingsHolder.Settings.SettingName;
SettingsHolder.Settings.SettingName = x;


1 commentaires

Je pense que c'est la route que je vais prendre. Comme je l'ai dit dans le post original, je veux un comportement singleton sans le singleton actuel, et cela me donne ça. En fait, je ferai probablement la classe singleton, mais laisserai le constructeur public à des fins de test. Merci!



2
votes

Dans la déclaration de votre commande utilisateur, vous pouvez simplement définir le contexte de données sur l'instance de l'objet contenant toutes les choses dont vous avez besoin pour se lier à!

Ensuite, vous pouvez accéder aux propriétés de l'instance d'objets dans le contrôle de l'utilisateur lorsque vous le feriez normalement.


2 commentaires

C'est vraiment bon à savoir, et je pourrais l'utiliser pour d'autres choses, mais j'aimerais laisser l'option ouverte pour accéder également aux paramètres du code.


@ Calculée parfaitement sensible, mais juste une tête, vous pouvez accéder à DataContext pour un contrôle utilisateur dans le code. Donc, si vous êtes lié à l'objet d'instance comme ci-dessus, puis dans le fichier de code-derrière a fait un peu var myInstance = (BindingObjectClass) this.datacontext Vous pouvez être capable d'accéder à cet objet de la variable MyInstance! J'espère que cela aide parfois à l'avenir!



0
votes

Ce que je fais est d'utiliser un cadre code> dans l'onglet code> et placez une page code> dans le cadre code>. (Mais je pense que la même chose peut s'appliquer avec un contrôle de l'utilisateur). Le constructeur déclenche uniquement lorsque la page est créée et que vous pouvez contrôler lorsque la page est créée et que vous pouvez transmettre des informations dans le constructeur. Une page a plus d'événements de cycle de vie à lier. J'utilise également l'événement chargé pour la construction de l'interface utilisateur (il incendie une fois). Si vous liez la page dans XAML, il incendiera lorsque vous démarrez l'application et vous ne pouvez pas passer des informations. Ceci crée une page et le montrant dans une boîte de dialogue mais cette page pourrait être liée à un cadre.

        NavigationWindow winSearchXML;
        using (new WaitCursor())
        {
            winSearchXML = new NavigationWindow();
            winSearchXML.Content = new PageSearchResultsXML(GabeLib.GetSearchXML(GabeLib.enumXMLtype.Flat));
        }
        winSearchXML.ShowDialog();


1 commentaires

C'est malin! Je n'ai jamais pensé à faire quelque chose comme ça. Je pense que pour ce que je travaille, cependant, c'est un peu trop excédentaire. Merci pour l'idée cependant.