c# example DataGrid montrant une nouvelle ligne, mais aucune



wpf combobox in gridview column (1)

Vous avez juste besoin d'ajouter un modèle d'édition:

        <Grid>
            <DockPanel Grid.Column="0" Grid.Row="0">
                <TextBlock DockPanel.Dock="Top" Text="Role Groups"/>
                <DataGrid DockPanel.Dock="Bottom" Name="dgRoleGroups" AutoGenerateColumns="False"
                          CanUserAddRows="True" CanUserDeleteRows="True"
                          HorizontalAlignment="Left" ItemsSource="{Binding ListSecurityUserRoleGroup}">
                    <DataGrid.Columns>

                        <DataGridTemplateColumn Header="Role Group" Width="*">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                    <ComboBox ItemsSource="{Binding ListSecurityRoleGroup, 
                            RelativeSource={RelativeSource AncestorType=UserControl}}" SelectedValue="{Binding RoleGroupID,UpdateSourceTrigger=PropertyChanged}"
                                  DisplayMemberPath="Description" SelectedValuePath="ID" IsHitTestVisible="False">

                                    </ComboBox>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                            <DataGridTemplateColumn.CellEditingTemplate>
                                <DataTemplate>
                                    <ComboBox ItemsSource="{Binding ListSecurityRoleGroup, 
                            RelativeSource={RelativeSource AncestorType=UserControl}}" 
                                  DisplayMemberPath="Description" SelectedValuePath="ID"  
                                              SelectedValue="{Binding RoleGroupID,UpdateSourceTrigger=PropertyChanged}"
                                  />
                                </DataTemplate>
                            </DataGridTemplateColumn.CellEditingTemplate>
                        </DataGridTemplateColumn>

                    </DataGrid.Columns>
                </DataGrid>
            </DockPanel>
        </Grid>

Vous pouvez également modifier le modèle de liste déroulante pour qu'il ressemble à un bloc de texte:

<ComboBox.Template>
        <ControlTemplate>
            <TextBlock Text="{Binding SelectedItem.Description,RelativeSource={RelativeSource Mode=TemplatedParent}}"></TextBlock>
        </ControlTemplate>
    </ComboBox.Template>

J'ai une grille de données avec une colonne affichant une liste déroulante. À l'heure actuelle, la nouvelle ligne est affichée sous les lignes existantes - comme prévu.

<grid> 
<DockPanel Grid.Column="0" Grid.Row="0">
        <TextBlock DockPanel.Dock="Top" Text="Role Groups"/>
        <DataGrid DockPanel.Dock="Bottom" Name="dgRoleGroups" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" HorizontalAlignment="Left" ItemsSource="{Binding ListSecurityUserRoleGroup}">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Role Group" Width="*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding ListSecurityRoleGroup, 
                                RelativeSource={RelativeSource AncestorType=UserControl}}" 
                                      DisplayMemberPath="Description" SelectedValuePath="ID"  
                                      SelectedValue="{Binding RoleGroupID}”/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>

            </DataGrid.Columns>
        </DataGrid>
    </DockPanel>
</Grid>

Où ListSecurityUserRoleGroup est une ObservableCollection de:

public class tbl_SecurityUserRoleGroup_Row
{
    public int UserID  { get; set; }
    public int RoleGroupID { get; set; }
}

Et ListSecurityRoleGroup est une liste de:

  public class tbl_Security_RoleGroup_Row 
{
    public int ID { get; set; }
    public string PublicID { get; set; }
    public string Description { get; set; }
}

Dans le code derrière j'ai:

dgRoleGroups.DataContext = ListSecurityUserRoleGroup;
dgRoleGroups.ItemsSource = ListSecurityUserRoleGroup;

La photo ci-dessous montre que la liaison pour la première rangée fonctionne; et j'ai une nouvelle rangée et peux choisir une valeur pour cela.

Cependant, je ne peux pas obtenir une autre nouvelle ligne. C'est le problème que j'essaie de résoudre.

De la lecture d'autres messages, je soupçonne qu'il me manque quelque chose dans le domaine de IEditableObject, INotifiyProperyChanged ou parce qu'il n'y a qu'une colonne dans cette grille de données, peut-être besoin de déclencher quelque chose à partir de la liste déroulante SelectedChanged et sinon, en créer un?

Je n'ai pas trouvé un article correspondant à mon problème mais je suis sûr qu'il est là ...

Il y a peut-être d'autres solutions qui n'impliquent pas de grille de données, mais une fois que cela fonctionne, ma tâche suivante est une grille de données contenant 2 colonnes de comboboxes, qui devront fonctionner là.





combobox