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.

Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top