web-dev-qa-db-fra.com

Liaison de datagrid dans WPF

Je sais que cela a déjà été demandé, mais j'ai fait presque tout ce qui est suggéré par les développeurs.

<DataGrid x:Name="Imported" VerticalAlignment="Top" DataContext="{Binding Source=list}"  AutoGenerateColumns="False" CanUserResizeColumns="True">
    <DataGrid.Columns>                
        <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}"/>
        <DataGridTextColumn Header="Date" Binding="{Binding Path=Date}"/>
    </DataGrid.Columns>
</DataGrid>

J'essaie de montrer cela dans la boîte de dialogue modale et de remplir la liste des licences dans le constructeur de la boîte de dialogue modale. Mais toujours rien ne se remplit à l'intérieur de la grille de données.

Code constructeur:

public diagboxclass()
{
    List<object> list = new List<object>();
    list = GetObjectList();
}

public class object
{
    string id;
    DateTime date;
    public string ID
    {
        get { return id; }
        set { id = value; }
    }
    public DateTime Date
    {
        get { return date; }
        set { date = value; }
    }
}

Pensez-vous que les gars ont quelque chose à voir avec la liste d'objets?

19
alice7

VEUILLEZ ne pas utiliser objet comme nom de classe:

public class MyObject //better to choose an appropriate name
{
    string id;
    DateTime date;
    public string ID
    {
       get { return id; }
       set { id = value; }
    }
    public DateTime Date
    {
       get { return date; }
       set { date = value; }
    }
}

Vous devez implémenter INotifyPropertyChanged pour cette classe et bien sûr appelez-le sur le Property setter. Sinon, les modifications ne sont pas reflétées dans votre interface utilisateur.

Votre classe Viewmodel/classe de boîte de dialogue doit avoir unProperty de votre MyObject liste. ObservableCollection<MyObject> est la voie à suivre:

public ObservableCollection<MyObject> MyList
{
     get...
     set...
}

Dans votre xaml, vous devez définir Itemssource sur votre collection de MyObject. (le Datacontext doit être votre classe de boîte de dialogue!)

<DataGrid ItemsSource="{Binding Source=MyList}"  AutoGenerateColumns="False">
   <DataGrid.Columns>                
     <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
     <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
   </DataGrid.Columns>
</DataGrid>
32
blindmeis

Sans voir cette liste d'objets, je pense que vous devriez vous lier à la propriété ItemsSource du DataGrid, pas à sa DataContext.

<DataGrid x:Name="Imported" VerticalAlignment="Top" ItemsSource="{Binding Source=list}"  AutoGenerateColumns="False" CanUserResizeColumns="True">
    <DataGrid.Columns>                
        <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
        <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
   </DataGrid.Columns>
</DataGrid>

(Cela suppose que l'élément [UserControl, etc.] qui contient le DataGrid a son DataContext lié à un objet qui contient la collection list. Le DataGrid est dérivé de ItemsControl, qui s'appuie sur sa propriété ItemsSource pour définir la collection à laquelle il lie ses lignes. Par conséquent, si list n'est pas la propriété d'un objet lié au DataContext de votre contrôle, vous devrez peut-être pour définir à la fois DataContext={Binding list} et ItemsSource={Binding list} sur le DataGrid ...)

22
Dan J

essayez de le faire dans le code derrière

   public diagboxclass()
   {
         List<object> list = new List<object>();
         list = GetObjectList();
         Imported.ItemsSource = null;
         Imported.ItemsSource = list;
   }

Assurez-vous également que votre liste est bien remplie et, comme mentionné par Blindmeis, n'utilisez jamais de mots qui ont déjà une fonction en c #.

5
Schuere