11
votes

Appeler une méthode d'UserControl dans MVVM

J'ai un problème avec appel à une méthode sur un UserControl. Entendre moi dehors:

  1. J'ai un usercontrol somecontrol dans quelque site.xaml

  2. aView.xaml's DataContext est quelque siteModel.cs

  3. Je veux pouvoir appeler somecontrol.dostuff () en quelque sorte, quelque part.

  4. Dostuff n'est pas spécifique à l'UI (j'aurais pu simplement appeler Dostuff à partir du code-derrière de Susview.xaml.cs s'il était spécifique à l'UI, mais dans ce cas, cela peut ne pas être.)

    Des idées?

    merci!


0 commentaires

7 Réponses :


6
votes

Vous ne voudrez probablement pas aimer la réponse, mais votre viewModel ne devrait pas avoir connaissance de votre interface utilisateur. Si vous avez une méthode non-UI sur votre UserControl, c'est probablement au mauvais endroit.

La seule chose que je pouvais penser est que vous souhaitiez peut-être mettre en œuvre un type de messagerie (comme ils ont dans MVVM Light ) qui pourrait déclencher l'exécution.

C'est soit cela, soit à repenser votre architecture de votre code.


3 commentaires

Je comprends où vous venez et croyez-moi, j'ai pensé à cela. Mais il faut un moment où vous avez vraiment besoin d'appeler une méthode. Par exemple, la méthode sur le contrôle de l'utilisateur peut être exposée et je ne serais peut-être pas la source de l'UserControl, donc je ne peux donc pas la modifier pour accueillir mon cas.


+1 Pour la suggestion, vous avez raison, ViewModel ne devrait pas avoir connaissance de la vue.


Peut-être que vous pouvez recrader la question de savoir, ViewModel essayant d'accéder au contrat mis en œuvre par UI. Cela gardera viewmodel ignorant l'interface utilisateur.



-1
votes

Dans la conception de MVVM, l'idée ne doit généralement pas avoir de code dans votre UserControl (le fichier XAML.CS) (dans un monde idéal). Toutes les interactions entre l'interface utilisateur et la viewModel doivent être traitées via des commandes et des liaisons ... Alors pourquoi avez-vous besoin de Dostuff dans votre commande utilisateur?

Vous pourriez avoir quelque chose comme p>

<Button Command="{Binding myCommandOnTheDataContextViewModel}" Content="{Binding somePropertyOnTheViewModel}" />


1 commentaires

"MVVM Design, l'idée n'est généralement pas de ne pas avoir de code dans votre UserControl" pourriez-vous montrer une citation des amateurs de MVVM? Cependant, je ne vois pas cela. Si vous avez du code / logique qui est purement visualisé, pourquoi ne pas le faire en code derrière? C'est un cas très rare cependant, mais s'il est nécessaire, pourquoi pas?



3
votes

On dirait que vous voulez que Dostuff se produise en réponse à certaines données ou à une logique dans votre VM, auquel cas la méthode la plus propre serait probablement d'utiliser un événement originaire de votre VM et géré par Dostuff. Si la gâchette ressemble plus à un changement d'état, vous pouvez également lier les données VM appropriées à une nouvelle propriété de dépendance sur votre UserControl et appelez Dostuff du gestionnaire de changement de DP.


0 commentaires

0
votes

Peut-être que votre usercontrol devrait vraiment être une vue, qui devrait alors avoir une vue de vie, qui contiendrait la méthode Dostuff (). SomecontrolViewModel sera instancié (à savoir que les personnes louées sont instanciées) SomecontrolViewModel, et peut donc appeler une méthode à ce sujet.


0 commentaires

0
votes

Si vous avez la première approche (et votre VM est instancié comme ressource dans XAML), vous pouvez utiliser certains événements normaux pour connecter votre méthode de contrôle Dostuff avec un événement sur VM (sur l'événement chargé).


0 commentaires

0
votes

si la méthode dostuff (); Est-ce que certaines logiques spécifiques à l'UI alors la méthode est au bon endroit. Lorsqu'il n'est pas alors il devrait être dans un autre objet (par exemple, 1eviewModel).

CertainviewModel est autorisé à appeler une méthode sur une vision lorsqu'elle est séparée via une interface. Comment cela peut être accompli est affiché par le Framework d'applications WPF (WAF) .


0 commentaires

4
votes

Un tel que la réponse à faire de la sorte à faire ce par découples les connaissances de la viewModel sur la vue est en utilisant les délégués d'action répondis par Mert ici

collé son code ici, si le lien pause par hasard. xxx


0 commentaires