Comment puis-je accéder à un contrôle dans le modèle mvvm dans viewmodel?

j'ai une Fenêtre WPF, et dans cette fenêtre, j'ai une grille.

j'utilise le modèle M-V-VM et je veux ajouter une zone de texte à la grille dynamiquement en code (dans viewmodel)

Comment puis-je accéder au réseau?

28
demandé sur Ting 2013-01-09 17:24:24

5 réponses

Utiliser Controller De Supervision schéma.

Lecture:

exemple d'implémentation pour CaliburnMicro framework MVVM est indiqué ici (même pour tous les autres cadres - ou vous pouvez le faire à la main si vous faites MVVM par vous-même):

http://drc.ideablade.com/devforce-2012/bin/view/Documentation/cocktail-tutorial-talk-to-view

Exemple:

1)Définir l'interface IViewViewModel (VM) parler à View avec la méthode requise(s)

public interface IView 
{
    void AddTextBoxToGrid();
}

2)Herit code behind View de votre IView et de mettre en œuvre IView.AddTextboxToGrid() méthode

public partial class View : IView 
{
    public void AddTextBoxToGrid() 
    {  
        // implement here your custom view logic using standard code behind; 
    }
}

3) Ajouter une propriété de type IView pour votre VM

public class ViewModel 
{
    public IView View { get; set; }
}

4) Set View propriété sur VM exemple ViewIView par exemple dans le code derrière DataContext.View = ceci comme IView; ou dans Caliburn vous pouvez utiliser IScreen.OnViewAttached remplacer la méthode)

public partial class View : IView 
{
    public View()
    {
        // access you VM by strategy of your framework or choice - this example is when you store your VM in View's DataContext
        (DataContext as ViewModel).View = this as IView;
    } 

    public void AddTextBoxToGrid() 
    {  
        // implement here your custom view logic using standard code behind; 
    }
}

5) dans votre VMappel IView.AddTextboxToGrid()

public class ViewModel 
{
    public IView View { get; set; }

    public void AddTextBoxToGrid() 
    {
        if (View == null) return;
        View.AddTextBoxToGrid()
    }
}
65
répondu nihique 2017-04-13 13:04:39

vous devriez déplacer votre code de création vers View, et ViewModel devrait simplement notifier view quand il devrait être appelé.

3
répondu Lonli-Lokli 2013-01-09 20:52:25

vous pouvez également utiliser le DataContext (qui est le ViewModel) de la vue dans le code derrière la vue, et ajouter la zone de texte à la grille là. Qui aurait plus de sens.

si vous donnez un nom à la grille dans votre fichier XAML, vous pourrez accéder à la grille dans le code derrière immédiatement.

1
répondu Geerten 2013-01-09 14:31:24

si vous utilisez Caliburn Micro, implémentez l'étape suivante:

  1. Faire le ViewModel héritée de l'interface IViewAware; vous allez implémenter deux méthodes AttachView et GetView de cette interface.

  2. définir une variable avec type de vue pour obtenir la référence à la vue

  3. Voir détail ci-dessous:

    private SomeViewClass v;
    public void AttachView(object view, object context = null)
    {
        v = view as BomView;
        if (ViewAttached != null)
             ViewAttached(this,
             new ViewAttachedEventArgs() { Context = context, View = view });
    }
    
    public object GetView(object context = null)
    {
        return v;
    }
    

plus tard, vous pouvez accéder à un seul élément sur la vue à travers V tel as v. txtName= "John"; etc...

0
répondu Trong Nguyen 2017-10-05 00:09:56

avant d'aller sur ViewMode, remontez votre codebehind et attrapez le contrôle de cible comme ça

ne pas abandonner ViewModel dans XAML instade de qui utiliser le gestionnaire d'événements

ceci vous fournit une nouvelle couche vous pouvez construire votre architecture comme ceci MVVM => MV (C)VM

-1
répondu dewelloper 2013-01-22 13:06:22