Problema di associazione DataGridComboBoxColumn.ItemsSource
-
19-09-2019 - |
Domanda
Ho 3 tabelle:Voce - che è il DataContext - ha una colonna di navigazione del Gruppo Gruppo - ha una colonna di navigazione per Categoria.
Vorrei avere nella DataGrid sia (Categoria e Gruppo) colonne e quando scelgo una categoria dovrebbe visualizzare nel gruppo col solo la Categoria di appartenenza.Gruppi.
Qui è il codice che sto lavorando su:
<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>
Aggiornamento
Vorresti dire che il problema è che la proprietà ItemsSource non può essere impostata a un non-statica?Ho il sospetto perché anche ho impostato il ItemsSource {Binding}
con il DummyConverter
non si ferma nel convertitore;e nella Categoria ComboBox funziona benissimo.
Soluzione
Le colonne del datagrid non hanno un datacontext, come mai sono aggiunti alla struttura ad albero visuale.suono un po ' strano, ma avere uno sguardo a vince il blog, il suo è un buon esempio di layout visivo.una volta che la griglia è attirato le cellule di avere un contesto di dati ed è possibile impostare le caselle combinate elementi di origine, nel loro normale uso di associazioni (non statico risorse..)
È possibile accedere alla casella combinata di elementi di origine in quanto tale:
<dg:DataGridComboBoxColumn>
<dg:DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=MyBindingPath}" />
</Style>
</dg:DataGridComboBoxColumn.EditingElementStyle>
</dg:DataGridComboBoxColumn>
Hanno un look qui e anche qui per un po ' di codice.Avrete anche bisogno di set di elementi di origine per non edting elemento come in questo post
Altri suggerimenti
Stavo usando MVVM e ho voluto associare la ItemSource
della colonna di una collezione di oggetti nella finestra dei dati di contesto.Ho già provato 10 modi diversi, e niente ha funzionato fino a quando ho trovato questa risposta.
Il trucco è quello di definire un CollectionViewSource
al di fuori della griglia e quindi fare riferimento all'interno della griglia utilizzando StaticResource
.Per esempio,
<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>