2009-11-12 8 views
10

Ho 3 tabelle: Elemento - che è il DataContext - ha una colonna di navigazione Gruppo Gruppo - ha una colonna di navigazione Categoria.Collegamento problema DataGridComboBoxColumn.ItemsSource

Voglio avere nel DataGrid entrambe (colonne Categoria &) e quando scelgo una categoria dovrebbe visualizzare nel gruppo solo i Category.Groups.

Ecco il codice 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
Vuoi dire il problema è che la proprietà ItemsSource non può essere impostato su un Binding non statico? Sospetto di sì, perché anche io ho impostato l'elemento Origine su {Binding} con lo DummyConverter e non si ferma nel convertitore; e nella categoria ComboBox funziona perfettamente.

risposta

28

Le colonne nel datagrid non hanno un datacontext, poiché non vengono mai aggiunte all'albero visivo. sembra un po 'strano, ma date un'occhiata allo vince's blog, ha un buon esempio del layout visivo. una volta che la griglia è disegnata le cellule hanno un contesto dati ed è possibile impostare la sorgente di elementi caselle combinate in loro utilizzando attacchi normali (non risorse statiche ..)

è possibile accedere alla casella combinata articoli fonte come tale:

<dg:DataGridComboBoxColumn> 
    <dg:DataGridComboBoxColumn.EditingElementStyle> 
     <Style TargetType="ComboBox"> 
     <Setter Property="ItemsSource" Value="{Binding Path=MyBindingPath}" /> 
     </Style> 
    </dg:DataGridComboBoxColumn.EditingElementStyle> 
</dg:DataGridComboBoxColumn> 

Dai uno sguardo allo here e anche allo here per un po 'di codice. Sarà inoltre necessario impostare la sorgente di elementi per l'elemento non edting come in questo post

+0

Come farlo funzionare per .NET 4.0 Datagrid? Il blog di Vince sembra essere obsoleto. – newman

+0

Non penso che l'implementazione del DataGrid di ComboColumn sia cambiata nella versione .net 4 –

+0

Ho usato lo stesso approccio, ma l'origine dati non sembra legare la colonna. Vedo una combobox vuota in DataGrid – Nps

0

stavo usando MVVM e volevo di impegnare la ItemSource della colonna ad una collezione di oggetti nel contesto dei dati finestra. Devo aver provato 10 modi diversi e non ha funzionato finché non ho trovato this answer.

Il trucco è definire un CollectionViewSource fuori dalla griglia e quindi fare riferimento all'interno della griglia utilizzando StaticResource. Ad 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>