web-dev-qa-db-fra.com

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 TextBox à la grille dynamiquement dans le code (dans le viewmodel)

Comment accéder au réseau?

32
Sanjay Patel

Utilisez Contrôleur Superviseur modèle.

Lecture:

Exemple d'implémentation pour CaliburnMicro Le framework MVVM est montré ici (fonctionnera de la même manière pour tous les autres frameworks - 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éfinissez l'interface IView dans laquelle ViewModel (VM) parlera à View avec la ou les méthodes requises

public interface IView 
{
    void AddTextBoxToGrid();
}

2) Héritez le code derrière View de votre IView et implémentez la méthode IView.AddTextboxToGrid()

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

3) Ajoutez une propriété de type IView à votre VM

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

4) Définissez la propriété View sur VM sur une instance de View en tant que IView par exemple en code derrière:

 DataContext.View = this as IView; 

ou dans Caliburn, vous pouvez utiliser la méthode de substitution IScreen.OnViewAttached)

public partial class View: IView 
{
    public View()
    {
        // access you VM by the 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 VM appelez IView.AddTextboxToGrid()

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

    public void AddTextBoxToGrid() 
    {
        if (View == null) return;
        View.AddTextBoxToGrid()
    }
}
69
nihique

Vous devez déplacer votre code de création vers View, et ViewModel doit simplement notifier à view quand il doit être appelé.

3
Lonli-Lokli

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

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

1
Geerten