DataGridComboBoxColumn.ItemsSource ligação problema
-
19-09-2019 - |
Pergunta
Eu tenho 3 tabelas: Artigo - que é o DataContext - que tem uma coluna Grupo de navegação Group -. Tem uma Categoria coluna de navegação
Eu quero ter na DataGrid ambos (categoria e Group) colunas e quando eu escolher uma categoria ele deve exibir na col grupo apenas os Category.Groups.
Aqui está o código que eu estou trabalhando em:
<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>
Atualizar
Você diria que o problema é que a propriedade ItemsSource não pode ser definido como um não-estático vinculativo?
Eu suspeito que sim, porque mesmo eu definir o ItemsSource para {Binding}
com o DummyConverter
ele não pára no conversor; e na categoria ComboBox ele funciona bem.
Solução
As colunas no DataGrid não tem um datacontext, como eles nunca são adicionados à árvore visual. soar um pouco estranho, mas ter um olhar para Vince blogue , o seu tem um bom exemplo do layout visual. uma vez que a grade é desenhada as células têm um contexto de dados e você pode definir a fonte de caixas de combinação itens neles usando ligações normais (recursos não estáticos ..)
Você pode acessar o item fonte caixa de combinação como tal:
<dg:DataGridComboBoxColumn>
<dg:DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=MyBindingPath}" />
</Style>
</dg:DataGridComboBoxColumn.EditingElementStyle>
</dg:DataGridComboBoxColumn>
Tenha um olhar aqui também aqui por algum código. Você também vai precisar de definir a fonte de itens para o elemento não edting como neste pós
Outras dicas
eu estava usando MVVM e queria ligar o ItemSource
da coluna a uma colecção de objectos no contexto de dados janela. I deve ter tentado 10 maneiras diferentes e nada funcionou até que encontrei esta resposta .
O truque é definir um CollectionViewSource
fora da grade e, em seguida, fazer referência a ela dentro da grade usando StaticResource
. Por exemplo,
<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>