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?
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 IView
ViewModel
(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 View
IView
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 VM
appel IView.AddTextboxToGrid()
public class ViewModel
{
public IView View { get; set; }
public void AddTextBoxToGrid()
{
if (View == null) return;
View.AddTextBoxToGrid()
}
}
vous devriez déplacer votre code de création vers View, et ViewModel devrait simplement notifier view quand il devrait être appelé.
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.
si vous utilisez Caliburn Micro, implémentez l'étape suivante:
Faire le ViewModel héritée de l'interface
IViewAware
; vous allez implémenter deux méthodes AttachView et GetView de cette interface.définir une variable avec type de vue pour obtenir la référence à la vue
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...
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