2010-11-11 3 views
3

je le XAML suivant:Silverlight - lier la colonne DataGrid à la propriété racine du modèle de vue?

<UserControl.Resources> 
    <local:MainPageViewModel x:Key="ViewModel" /> 
</UserControl.Resources> 

<Grid x:Name="LayoutRoot" 
     DataContext="{Binding Source={StaticResource ViewModel}}"> 
    <sdk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Items}"> 
     <sdk:DataGrid.Columns> 
      <sdk:DataGridTextColumn Header="ID" Binding="{Binding ID}" /> 
      <sdk:DataGridTextColumn Header="Name" Binding="{Binding Name}" /> 
      <sdk:DataGridCheckBoxColumn 
       Header="Checkbox Column" 
       Binding="{Binding Source={StaticResource ViewModel}, 
            Path=SomeBooleanProperty}"/> 

     </sdk:DataGrid.Columns> 
    </sdk:DataGrid> 
</Grid> 

Donc, fondamentalement, je veux avoir l'une des colonnes (la colonne de cases à cocher) lié à une propriété (SomeBooleanProperty) qui est directement sur le ViewModel, par opposition à une propriété sur l'un des articles de la collection Items. (Oui, c'est un peu artificiel, mais cela m'amène à mon problème.) Le problème est que d'après mon test, si vous liez via StaticResource, il semble que la valeur ne soit pas mise à jour en fonction du déclenchement de l'événement INotifyPropertyChanged. La valeur initiale est correcte, mais elle ne change jamais. Je ne peux pas trouver un autre moyen de sortir "out" de la liaison d'éléments et de sauvegarder vers le ViewModel, à partir d'une liaison de colonne.

Je pense que dans WPF vous pouvez le faire avec RelativeBinding en utilisant FindAncestor. Mais cette fonctionnalité n'existe pas dans Silverlight. Existe-t-il d'autres moyens d'accomplir cela?

+0

+1 Bonne question! Vous m'avez aussi curieux maintenant. Pourriez-vous simplement vous assurer que le nom de la propriété n'est pas une propriété qui existe dans la source de votre élément? Je pensais que c'est par défaut le modèle de vue si la propriété n'est pas un membre de la source de l'élément. –

+0

Pourriez-vous fournir une partie de votre code source. J'ai essayé exactement votre xaml et cela fonctionne. Peut-être qu'une partie de votre source ViewModel serait utile pour localiser le problème. – TerenceJackson

+0

@TerenceJackson: on dirait que tu as raison. J'ai reconstruit la page et cela a fonctionné. Voir ma réponse ci-dessous. – RationalGeek

Répondre

0

Je ne sais vraiment pas Qu'est-il arrivé. Basé sur le commentaire de @ TerenceJackson disant que cela a fonctionné pour lui, je complètement reconstruit la page en question et le code VM, et tout a fonctionné. J'ai regardé d'un oeil très critique les deux morceaux de code pour comprendre ce qui était différent, mais je ne pouvais pas. Donc, même si cela me dérange, je vais devoir passer à autre chose. Je pense que je vais laisser cette question de côté, au cas où quelqu'un aurait le même problème et trouverait la cause.

3

La liaison d'éléments n'est pas limitée aux "contrôles". Vous pouvez essayer la liaison d'élément au LayoutRoot car elle est résolue au moment de l'exécution simplement en fonction des noms de la portée actuelle.

Il doit ensuite récupérer le DataContext de l'élément sur lequel vous le pointez.

par exemple.

<sdk:DataGridCheckBoxColumn 
       Header="Checkbox Column" 
       Binding="{Binding ElementName=LayoutRoot, 
            Path=SomeBooleanProperty}"/> 

Si la liaison ne tire toujours pas que ce sera une caractéristique/défaut de la CheckBoxColumn (par exemple, il capte les valeurs du contexte de données de ligne)

Questions connexes