Question

J'ai 3 tables: Point - qui est le DataContext - il a un groupe de colonnes de navigation Groupe -. A une colonne de navigation Catégorie

Je veux avoir dans le DataGrid deux (catégorie et groupe) colonnes et lorsque je choisis une catégorie il devrait afficher dans le groupe col que les Category.Groups.

Voici le code, 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 soupçonne parce que même si je mets le ItemsSource à {Binding} avec le DummyConverter ne s'arrête pas dans le convertisseur; et dans la zone de liste déroulante Catégorie il fonctionne très bien.

Était-ce utile?

La solution

Les colonnes du DataGrid n'ont pas datacontext, car ils ne sont jamais ajoutés à l'arbre visuel. sembler un peu bizarre, mais un coup d'oeil à blog vince, son obtenu 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 (ressources non statiques ..)

Vous pouvez accéder à la zone de liste déroulante source de éléments tels que:

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

Regardez ici aussi pour un code. Vous devrez également source définir les éléments de l'élément non edting comme dans ce

Autres conseils

J'utilisais MVVM et je voulais lier la ItemSource de la colonne à une collection d'objets dans le contexte des données de la fenêtre. Je dois avoir essayé 10 différentes façons et rien ne fonctionnait jusqu'à ce que je trouve cette réponse .

L'astuce consiste à définir un CollectionViewSource en dehors de la grille, puis 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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top