2009-06-25 10 views
3

I "essaie d'envelopper ma tête autour MVVM Je comprends beaucoup de lui, mais je vais avoir du mal à saisir un aspect:.. Réglage DataContextEn C#, comment puis-je définir DataContext sur une vue à partir du ViewModel?

Je veux montrer une vue d'un objet particulier. L'utilisateur ne peut pas décider ce qui est visible, donc j'ai besoin de créer la vue dans le code, puis je veux définir le DataContext de la vue sur un objet (pour la liaison). la vue pour cela, mais View.LayoutRoot.DataContext n'est pas publique

Qu'est-ce que je manque

essayant d'éviter ceci:.?

public class View 
{ 
    public View(object dataContext) 
    { 
     InitializeComponent(); 
     LayoutRoot.DataContext = dataContext; 
    } 
} 

avec quelque chose comme ceci:

public class ViewModel 
{ 
    ... 

    public UIElement GetView() 
    { 
     UIElement *element = new View(); 
     element.LayoutRoot.DataContext = element; 
     return element; 
    } 
} 

Répondre

7

Ne pas oublier que la vue doit savoir sur le ViewModel, et non l'inverse.

Donc, dans votre cas, mettre du code dans ViewModel pour créer la vue n'est pas la meilleure solution.

Le article de Josh Smith sur MVVM a un section lors de l'application de View au ViewModel. Il recommande d'utiliser les DataTemplates de WPF pour sélectionner votre View dans XAML.

+0

merci beaucoup pour votre aide. ça m'a poussé dans la bonne direction. – Jeremiah

0

Si vous utilisez un contrôle XAML ou une fenêtre (ce qui devrait être le cas si vous utilisez MVVM), LayoutRoot (Grid par défaut) est public. Dans votre exemple, vous n'utilisez qu'une classe ordinaire pour View, il est donc difficile de dire ce qui se passe.

En outre, je seconde l'opinion de Cameron - ni View ni ModelView ne devraient traiter de l'assignation de DataContext. Cela peut être fait de différentes manières (DataTemplate, injection de dépendances, classe spéciale de construction, code brut) mais normalement cela se passe au niveau de l'application.

Questions connexes