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?
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()
}
}
Vous devez déplacer votre code de création vers View, et ViewModel doit simplement notifier à view quand il doit être appelé.
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.