2009-11-12 9 views
10

J'ai 3 tables: Elément - qui est le DataContext - il a une colonne de navigation Groupe Groupe - a une colonne de navigation Catégorie.Problème liaison DataGridComboBoxColumn.ItemsSource

Je souhaite avoir dans les deux colonnes DataGrid (catégorie & Group) et lorsque je choisis une catégorie, il doit afficher dans le groupe col uniquement les Category.Groups.

Voici le code que je travaille sur:

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

Mise à jour
Diriez-vous que le problème est que la propriété ItemsSource ne peut pas être réglé sur une liaison non-statique? Je le soupçonne parce que même si je mets le ItemsSource à {Binding} avec le DummyConverter il ne s'arrête pas dans le convertisseur; et dans la catégorie ComboBox cela fonctionne bien.

Répondre

28

Les colonnes de la grille de données n'ont pas de contexte de données, car elles ne sont jamais ajoutées à l'arborescence visuelle. sonner un peu bizarre, mais jetez un oeil à vince's blog, il a un bon exemple de la mise en page visuelle. une fois que la grille est dessinée les cellules ont un contexte de données et vous pouvez définir la source zones de liste déroulante articles en les utilisant des liaisons normales (pas de ressources statiques ..)

Vous pouvez accéder à la zone de liste déroulante source de points en tant que tels:

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

Regardez here et aussi here pour du code. Vous devrez également définir la source d'éléments pour l'élément non edting comme dans ce post

+0

Comment le faire fonctionner avec .NET 4.0 Datagrid? Le blog de Vince semble être périmé. – newman

+0

Je ne pense pas que l'implémentation de la ComboColumn de dataagrid a changé dans la version .net 4 –

+0

J'ai utilisé la même approche, mais la source de données ne semble pas lier la colonne. Je vois une zone de liste déroulante vide dans DataGrid – Nps

0

j'utilisais MVVM et je voulais lier le ItemSource de la colonne à une collection d'objets dans le contexte des données de la fenêtre. Je dois avoir essayé 10 façons différentes et rien n'a fonctionné jusqu'à ce que j'ai trouvé this answer.

L'astuce consiste à définir un CollectionViewSource en dehors de la grille, puis de le référencer à l'intérieur de la grille en utilisant StaticResource. Par exemple,

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