2009-12-01 4 views
2

Dans mon application SilverLight, j'ai une propriété dans mon ViewModel appelée 'vmProperty' et une liste appelée 'dgSource'.SilverLight - MVVM liant la propriété viewmodel à la colonne datagrid

Je lie ma source dgSource à la grille de données en tant que ItemsSource, point auquel chaque paramètre de ligne de la grille de données change pour chaque élément dans dgSource. L'une des colonnes, par exemple une colonne à cocher, doit être liée à vmProperty. Mais puisque le ViewModel n'est plus le datacontext de la ligne, je ne peux pas accéder à cette propriété.

Comment contourner ce problème? Si la question n'est pas claire, s'il vous plaît faites le moi savoir et je vais poster un échantillon. Merci d'avance.

+0

Voulez-vous vraiment que chaque occurrence de case à cocher de chaque ligne se lie à la même propriété sur l'objet parent, cela ne me semble pas très logique? – AnthonyWJones

Répondre

0

En supposant que votre ViewModel est affecté comme DataContext du LayoutRoot cela devrait fonctionner: -

IsChecked="{Binding DataContext.vmProperty, ElementName=LayoutRoot}" 

Bien sûr, cela ne fonctionne pas, en fin de compte un modèle est répliquée et par conséquent "LayoutRoot" n'existe pas dans l'espace de nom où la liaison est réellement utilisée.

La solution la plus simple puisqu'il s'agit d'un ViewModel est de changer le modèle. Exposer la valeur requise sur les objets disponibles dans le dgSource ou d'exposer une propriété Parent qui navigue vers le ViewModel.

+0

Merci pour vos réponses. J'ai utilisé la méthode ElementName que vous avez mentionnée. Mais je lance le même problème que dans « http://stackoverflow.com/questions/1089650/silverlight-datagrid-celltemplate-binding-to-viewmodel ». Je l'ai mis en dehors de la grille de données et ce code fonctionne très bien. Mais dans le DataGrid il ne le fait pas. De toute façon, j'ai utilisé le lien fourni dans ce fil 'http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx », mais cela ne semble pertinent que pour WPF. Je suis incapable d'accéder addowner ou OverrideMetadata. Pensées? – etrast81

+0

Merci Anthony, parviendraient à ce dans le cadre de dgSource. Pas content car c'est une réplication. Mais ça marche. Alors ... :) – etrast81

+0

Cest l'avantage d'un modèle de __view__.Ce serait très insatisfaisant s'il s'agissait simplement de __model__, mais tout le point de vue d'un modèle de vue est sa forme avérée de données qui supporte une vue ou une tâche spécifique. – AnthonyWJones

0

Essayez de définir vérifié la propriété de votre colonne chechbox que:

{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type YourViewClassName}}, Path=DataContext.vmProperty} 

C'est dire que l'élément parent type est votre type d'affichage sera trouvée et que vmProperty de son DataContext sera récupéré en tant que valeur.

MISE À JOUR:

Il était solution pour WPF.

Pour silverlight Je pense que vous pouvez essayer d'utiliser la construction comme ceci:

{Binding Path=DataContext.vmProperty, ElementName=YourElement} 

Où DataContext est YourElement instance de votre modèle de vue. Je pense que ça peut être une grille par exemple.

<Grid x:Name="YourElement" DataContext={Binding}> 
<!-- DataGrid here --> 
</Grid> 
+0

Je pense que c'est WPF, n'est-ce pas? SilverLight n'a pas RelativeSource ou AncestorType, je crois. – etrast81

+0

Il a RelativeSource mais seulement dans une capacité très limitée – AnthonyWJones

+0

Désolé, il est WPF. – bniwredyc

Questions connexes