7
votes

Devrais-je stocker une référence à la vue de la vue parent dans la vieille vieilleModel?

Donc, si je stocke la référence de la vue parent dans la vieille vieilleLodel sera-t-il un crime? Vais-je casser des règles MVVM? Ma vue enfant est une fenêtre avec un menu contextuel. Lorsque l'élément de menu approprié est sélectionné, une nouvelle vue enfant doit être créée. Le parent n'est responsable que de créer la vue enfant. Donc, garder une référence au modèle de vue des parents, fera beaucoup de bien pour moi. Dans le même temps, je ne veux pas casser les règles de motif.

class MainViewModel
{
    List<ChildViewModel> _childrenViewModels = new List<ChildViewModel>();

    public AddChild(ChildViewModel childViewModel)
    {
        _childrenViewModels.Add(childViewModel);
        childViewModel.Owner = this;
    }
}

class ChildViewModel
{
    private Child _child;
    public MainViewModel Owner { get; set; }

    public ChildViewModel(Child child)
    {
        _child = child;
    }
}


5 commentaires

Les modèles ne sont qu'une directive pour vous lancer; Pas plus. Seulement si vous vous retrouvez à vous égrader du motif, cela vous semble-t-il et voyez si vous avez choisi le mauvais modèle.


Les modèles ne sont pas conçus pour créer une architecture, ils sont censés aborder des problèmes pouvant survenir dans l'architecture. Le moyen le plus simple d'assurer l'objectif de l'entreprise et l'intégrité est la bonne façon.


Donc, si je stocke la référence de la vue parent dans la vieille vieilleLodel sera un crime - absolument no. Qui t'as dit ça? Il est parfaitement correct que tout point de vue a une référence à tout autre point de vue (tant qu'il ne contient pas de références aux éléments d'interface utilisateur). L'idée de MVVM est de séparer la présentation du comportement, et non de créer de nombreuses restrictions qui vous empêchent d'écrire du code de nettoyage.


Gentiment dit Highcore.


Faites attention aux dépendances circulaires - évidemment si vous faites une injection de constructeur et des tests unitaires, vous constaterez peut-être que cela dépend de B et B dépend d'un, qui peut être une odeur de code. Je ne dis pas de ne pas garder une référence au parent, mais il devrait y avoir une raison pour cela - quelle est la raison ici? Pouvez-vous ne pas utiliser un événement / action bouillonnant ou le modèle d'agrégateur d'événement?


3 Réponses :


2
votes

La réponse est non, mais pour votre objectif, pourquoi avez-vous besoin de cette référence si tout le parent fait est de créer la vieille vieille. Quel est le but d'avoir ce lien?


1 commentaires

J'ai besoin de la référence car lorsque l'utilisateur sélectionne un élément de menu particulier dans le menu contextuel de la vue enfant, il devrait créer une nouvelle fenêtre. Maintenant, je veux le laisser à la vue parent (principale) à la création de vues et fenêtres enfants. Mais l'événement se produit dans la vue enfant. Peut-être que nous pourrions aussi faire des événements routage? Je ne sais pas, WPF est si gros, peu importe combien de livres que j'ai lus, je ne me souviens pas tout. Par conséquent, je travaille sur ce projet pour vraiment le comprendre.



3
votes

Non. En général, si vous utilisez cette technique plusieurs fois, essayez de le cacher derrière une abstraction, c'est ce que c'est ce que le fameux caliburn.micro [Je l'aime] Le projet fait avec son Interface ICHILD < / a>.


0 commentaires

1
votes

Bien que ce modèle ne soit pas du tout d'un crime ou d'une "odeur de code", il se peut que, dans de nombreuses situations, il fonctionne mieux pour transmettre une référence au parent sous la forme d'une mise en œuvre d'une interface, plutôt que comme sa propre classe. Ainsi, seules les propriétés ou les méthodes dont l'enfant doit accéder au parent sont définis dans l'interface, mais l'enfant n'a pas accès à d'autres méthodes publiques ou propriétés de la classe mère, ce qui pourrait causer des bugs s'il est utilisé par erreur. Cela peut impliquer un peu plus de code, mais la connexion en lâche entre les classes peut offrir des avantages. Si rien de plus, il aide à rendre la liaison entre enfant et parent plus auto-documentant et plus facile pour les personnes qui lisent le code à comprendre.


0 commentaires