2009-11-12 6 views
10

unión problema que tengo 3 tablas: del artículo - que es el DataContext - que tiene una columna de navegación Grupo Grupo - tiene una categoría columna de navegación.DataGridComboBoxColumn.ItemsSource

Quiero tener en el DataGrid las dos columnas (Categoría & Grupo) y cuando elijo una categoría, debe mostrarse en el grupo de columnas solo la Categoría. Grupos.

Aquí está el código que estoy trabajando en:

<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> 

actualización
diría que el problema es que la propiedad ItemsSource no se puede ajustar a una unión no estática? pienso que sí, porque incluso me puse la ItemsSource a {Binding} con el DummyConverter no se detiene en el convertidor; y en la Categoría ComboBox funciona bien.

Respuesta

28

Las columnas de la cuadrícula de datos no tienen un DataContext, ya que nunca se agregan al árbol visual. suena un poco raro, pero eche un vistazo a vince's blog, tiene un buen ejemplo de la disposición visual. una vez que se dibuja la cuadrícula las células tienen un contexto de datos y se puede ajustar la fuente de cuadros combinados artículos en ellos usando enlaces normales (no recursos estáticos ..)

Se puede acceder al cuadro combinado elementos de origen como tal:

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

Tener una mirada here y también here por algún código. También tendrá que establezca la fuente de artículos para el elemento no la edición por como en este post

+0

Cómo hacer que funcione para .NET 4.0 Datagrid? El blog de Vince parece estar desactualizado. – newman

+0

no creo que la aplicación de la cuadrícula de datos de la ComboColumn cambió en la versión .NET 4 –

+0

Solía ​​mismo enfoque, pero la fuente de datos no parece obligar a la columna. Estoy viendo cuadro combinado vacía en DataGrid – Nps

0

que estaba usando MVVM y quería obligar a la ItemSource de la columna a una colección de objetos en el contexto de datos ventana. Debo haber intentado 10 formas diferentes y nada funcionó hasta que encontréthis answer.

El truco es definir un CollectionViewSource fuera de la cuadrícula y luego hacer referencia dentro de la cuadrícula usando StaticResource. Por ejemplo,

<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>