10
votes

WPF DataGrid: Ligne vierge manquante

Je crée une fenêtre WPF avec un DataGrid , et je veux afficher la ligne "Nouvel élément" vide au bas de la grille qui me permet d'ajouter un nouvel élément à la grille. Pour une raison quelconque, la ligne vierge n'est pas représentée sur la grille sur ma fenêtre. Voici le balisage que j'ai utilisé pour créer le DataGrid : xxx

Je ne peux pas comprendre pourquoi la ligne vierge ne s'affiche pas. J'ai essayé le matériel évident ( isreadonly = "false" , canaseraddrows = "vrai" ), sans chance. Une idée de la raison pour laquelle la ligne vierge est désactivée? Merci pour votre aide.


0 commentaires

7 Réponses :


5
votes

Vincent Sibal a posté un Article décrivant ce qui est requis pour ajouter de nouvelles lignes à un DataGrid . Il existe différentes possibilités et la majeure partie de celle-ci dépend du type de collection que vous utilisez pour sélectionnéproject.tasks .

Je recommanderais de vous assurer que "tâches" n'est pas une collection en lecture seule et qu'elle prend en charge l'une des interfaces requises (mentionnée dans le lien précédent) pour permettre à de nouveaux éléments d'être ajoutés correctement avec DataGrid.


2 commentaires

En réalité, les tâches sont une observablecollection . J'ai fait un projet de test contraignant une grille de données sur le même type de collection et la ligne vierge est présente au bas de la grille. Le poteau de blog de Vincent est bon, mais il le fait sonner comme si vous devez mettre en œuvre ieditabilobject, ce qui n'est pas le cas. Un datagramme de vanille simple, lié à une observablecollection doit afficher la ligne vierge. Voir CODEPROJEJECT.COM/KB/WPF/MVVM_DATAGRID.ASPX .


Merci beaucoup qui a été utile. Sincèrement.



6
votes

a finalement revenu celui-ci. Je ne vais pas changer la réponse acceptée (coche verte), mais voici la cause du problème:

My View Model Wraps Classes de domaine pour fournir une infrastructure nécessaire par WPF. J'ai écrit un Article de codeProject sur la méthode wrap que j'utilise , qui comprend une classe de collecte qui a deux paramètres de type: xxx

dm est une classe de domaine emballée et dm Est-ce que la classe WPF qui l'enveloppe.

Il orthographique que, pour une raison quelconque étrange, le deuxième paramètre de type dans la classe de collecte provoque le DataGrid WPF de devenir un éventail. Le correctif consiste à éliminer le paramètre de deuxième type.

ne peut pas dire pourquoi cela fonctionne, seulement que cela fait. J'espère que cela aide quelqu'un d'autre sur la route.


0 commentaires

64
votes

Vous devez également avoir un constructeur par défaut sur le type de la collection.


5 commentaires

C'est la réponse qui aurait dû être vérifiée>.


Oui, c'est la réponse du même problème que j'avais.


Et si la collection est d'un type d'interface? Observablecollection


Cette réponse correcte m'a raté, car il est sur le bas sans code.


Il convient également de noter que le constructeur doit être public . Il semble que le datagrid ne considère pas interne ou des constructeurs privés .



1
votes

Ajoutez un élément vide à vos itemsSource, puis supprimez-le. Vous devrez peut-être régler CaneserAjouter à TRUE après cela. J'ai lu cette solution ici : (Postes de Jarrey et Rick Roen)

J'ai eu ce problème lorsque je définirai l'itemSource vers une Vieille default de DataTable et la vue était vide. Les colonnes ont été définies cependant, cela aurait dû être capable de les obtenir. Heh.


1 commentaires

Pouah. Merci. Cela m'a conduit absolument fou. J'ai finalement abandonné des entités et j'ai déménagé sur des jeux de données typés et même que a échoué. L'astuce est de Attribuer la collection d'abord et alors le manipuler en ajoutant et en supprimant un objet.



5
votes

À mon avis, il s'agit d'un bogue dans la DataGrid. Le lien de Mike Blandford m'a aidé Pour enfin se rendre compte de ce que le problème est le suivant: le datagrid ne reconnaît pas le type des lignes jusqu'à ce qu'il ait un objet réel lié. La ligne Edition n'apparaît pas B / C La grille de données ne connaît pas les types de colonne. Vous penseriez que la liaison d'une collection fortement dactylographiée fonctionnerait, mais ce ne serait pas.

Pour développer la réponse de Mike Blandford, vous devez d'abord attribuer la collection vide, puis ajouter et supprimer une ligne. Par exemple, P>

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        // data binding
        dataGridUsers.ItemsSource = GetMembershipUsers();
        EntRefUserDataSet.EntRefUserDataTable dt = (EntRefUserDataSet.EntRefUserDataTable)dataGridUsers.ItemsSource;
        // hack to force edit row to appear for empty collections
        if (dt.Rows.Count == 0)
        {
            dt.AddEntRefUserRow("", "", false, false);
            dt.Rows[0].Delete();
        }
    }


0 commentaires

0
votes

Pour moi, le meilleur moyen d'implémenter asynchrone modifiable datagrid code> ressemble à celui:

Voir modèle: strong> p>

<UserControl x:Class="UCM.WFDesigner.Views.UserTextMainView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:model="clr-namespace:Cellebrite.Diagnostics.Model.Entities;assembly=Cellebrite.Diagnostics.Model"
         xmlns:System="clr-namespace:System;assembly=mscorlib"
         xmlns:converters1="clr-namespace:UCM.Infra.Converters;assembly=UCM.Infra"
         xmlns:core="clr-namespace:UCM.WFDesigner.Core"
         mc:Ignorable="d"
         d:DesignHeight="300"
         d:DesignWidth="300">


<DockPanel>
    <StackPanel Orientation="Horizontal"
                DockPanel.Dock="Top"
                HorizontalAlignment="Left">


        <DockPanel>

            <TextBlock Text="Search:"
                       DockPanel.Dock="Left"
                       VerticalAlignment="Center"
                       FontWeight="Bold"
                       Margin="0,0,5,0" />

            <Button Style="{StaticResource StyleButtonDeleteCommon}"
                    Height="20"
                    Width="20"
                    DockPanel.Dock="Right"
                    ToolTip="Clear Filter"
                    Command="{Binding ClearSearchCommand}" />

            <TextBox Text="{Binding SearchInput, UpdateSourceTrigger=PropertyChanged}"
                     Width="500"
                     VerticalContentAlignment="Center"
                     Margin="0,0,2,0"
                     FontSize="13" />

        </DockPanel>
    </StackPanel>
    <Grid>
        <DataGrid ItemsSource="{Binding Path=TranslationsView}"
                  AutoGenerateColumns="False"
                  SelectionMode="Single"
                  CanUserAddRows="True">
            <DataGrid.Columns>
              <!-- your columns definition is here-->
            </DataGrid.Columns>
        </DataGrid>
        <!-- your "busy indicator", that shows to user a message instead of stuck data grid-->
        <Border Visibility="{Binding IsBusy,Converter={converters1:BooleanToSomethingConverter TrueValue='Visible', FalseValue='Collapsed'}}"
                Background="#50000000">
            <TextBlock Foreground="White"
                       VerticalAlignment="Center"
                       HorizontalAlignment="Center"
                       Text="Loading. . ."
                       FontSize="16" />
        </Border>
    </Grid>
</DockPanel>


0 commentaires

1
votes

Cela me suis arrêté, j'ai oublié de nouveau dans l'instance et c'était un cauchemar pour moi. Une fois que j'ai créé une instance de la collection dans OnSIPLOa chargé, elle a été résolue. XXX

Ceci a résolu mon problème. J'espère que cela peut aider les autres


0 commentaires