Problème de liaison DataGridComboBoxColumn.ItemsSource
-
19-09-2019 - |
Question
J'ai 3 tables: Point - qui est le DataContext - il a un groupe de colonnes de navigation Groupe -. A une colonne de navigation Catégorie
Je veux avoir dans le DataGrid deux (catégorie et groupe) colonnes et lorsque je choisis une catégorie il devrait afficher dans le groupe col que les Category.Groups.
Voici le code, je travaille sur:
<tk:DataGrid AutoGenerateColumns="False" ItemsSource="{Binding}">
<tk:DataGrid.Columns>
<!--Works-->
<tk:DataGridComboBoxColumn
Header="Categroy"
DisplayMemberPath="Title"
SelectedValuePath="CategoryId"
SelectedValueBinding="{Binding Group.Category.CategoryId}"
ItemsSource="{Binding Context.Categories,
Source={x:Static Application.Current}}"
/>
<!--Look at these two things:-->
<!--This does work-->
<tk:DataGridTemplateColumn>
<tk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ItemsControl
ItemsSource="{Binding Group.Category.Groups}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type data:Group}">
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
</tk:DataGridTemplateColumn.CellTemplate>
</tk:DataGridTemplateColumn>
<!--But this does NOT work, even it's the same source-->
<!--Notice I even tried a dummy converter and doesnt reach there-->
<tk:DataGridComboBoxColumn
Header="Group"
DisplayMemberPath="Title"
SelectedValuePath="GroupId"
ItemsSource="{Binding Group.Category.Groups,
Converter={StaticResource DummyConverter}}"
SelectedValueBinding="{Binding Group.GroupId}"
/>
</tk:DataGrid.Columns>
</tk:DataGrid>
Mise à jour
Diriez-vous que le problème est que la propriété ItemsSource ne peut pas être réglé sur une liaison non-statique?
Je soupçonne parce que même si je mets le ItemsSource à {Binding}
avec le DummyConverter
ne s'arrête pas dans le convertisseur; et dans la zone de liste déroulante Catégorie il fonctionne très bien.
La solution
Les colonnes du DataGrid n'ont pas datacontext, car ils ne sont jamais ajoutés à l'arbre visuel. sembler un peu bizarre, mais un coup d'oeil à blog vince, son obtenu un bon exemple de la mise en page visuelle. une fois que la grille est dessinée les cellules ont un contexte de données et vous pouvez définir la source zones de liste déroulante articles en les utilisant des liaisons normales (ressources non statiques ..)
Vous pouvez accéder à la zone de liste déroulante source de éléments tels que:
<dg:DataGridComboBoxColumn>
<dg:DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=MyBindingPath}" />
</Style>
</dg:DataGridComboBoxColumn.EditingElementStyle>
</dg:DataGridComboBoxColumn>
Regardez ici aussi pour un code. Vous devrez également source définir les éléments de l'élément non edting comme dans ce
Autres conseils
J'utilisais MVVM et je voulais lier la ItemSource
de la colonne à une collection d'objets dans le contexte des données de la fenêtre. Je dois avoir essayé 10 différentes façons et rien ne fonctionnait jusqu'à ce que je trouve cette réponse .
L'astuce consiste à définir un CollectionViewSource
en dehors de la grille, puis le référencer à l'intérieur de la grille en utilisant StaticResource
. Par exemple,
<Window.Resources>
<CollectionViewSource x:Key="ItemsCVS" Source="{Binding MyItems}" />
</Window.Resources>
<!-- ... -->
<DataGrid ItemsSource="{Binding MyRecords}">
<DataGridComboBoxColumn Header="Column With Predefined Values"
ItemsSource="{Binding Source={StaticResource ItemsCVS}}"
SelectedValueBinding="{Binding MyItemId}"
SelectedValuePath="Id"
DisplayMemberPath="StatusCode" />
</DataGrid>