2009-07-10 4 views
1

Que dois-je faire pour que mon contrôle WPG DataGrid soit lié à un objet DataTable?Liaison de données d'un contrôle DataGrid WPF à un objet System.Data.DataTable?

Je souffre depuis plusieurs jours maintenant. Même lorsque la liaison et la requête fonctionnent correctement, et qu'il y a des données observables dans la table, rien n'apparaît dans la grille de données.

Mon code XAML ressemble à ceci:

<Window x:Class="DataGridTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:TK="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit" 
    Title="Window1" Height="300" Width="300"> 
     <Grid> 
      <TK:DataGrid ItemsSource="{Binding Path=DTUsers}" /> 
     </Grid> 
</Window> 

Mon C# code-behind ressemble à ceci:
(OAC est mon Data Access Object)

public partial class Window1 : Window 
{ 
    public dao DAO = new dao (ConnectionString) ; 
    public System.Data.DataTable DTUsers { get; set; } 

    public Window1() 
    { 
     InitializeComponent(); 

     if (DAO != null) 
      DTUsers = DAO.Query(@"SELECT * FROM users"); 
      // Returns a DataTable object containing user records. 
      // I have confirmed that this returns my data correctly. 
    } 
} 

J'ai vérifié la sortie, et il n'y a pas d'erreurs de liaison.
Pourquoi est-ce que cela compilera et exécutera, mais n'affichera aucune donnée ??? (Si vous ne savez pas où se trouve le contrôle DataGrid, la boîte à outils WPF est disponible here. Installez-le, ajoutez une référence à WPFToolkit.dll [qui apparaîtra dans la boîte de dialogue "Ajouter une référence" sous ".NET" "], et fournir la déclaration d'espace de noms XML [dans mon code XAML ci-dessus] pour utiliser le contrôle WPG DataGrid.)

Répondre

5

InitializeComponent() instanciera votre balisage, y compris la liaison. À ce stade DTUsers est toujours null, donc rien n'est affiché. Ensuite, vous changez DTUsers, mais il n'y a aucun moyen pour la liaison (et donc la grille) de savoir que vous l'avez fait - et donc il ne fait rien.

Vous devez créer une propriété de dépendance DTUsers ou implémenter INotifyPropertyChanged sur votre classe et déclencher l'événement PropertyChanged après avoir modifié la valeur de la propriété.

+0

C'est tout à fait logique! Merci beaucoup! – Giffyguy

+0

Hmm --- J'ai déplacé InitializeComponent() tout en bas du constructeur, et maintenant au moins le DataGrid est capable de se remplir avec les colonnes et les en-têtes de colonnes appropriés ... mais il ne montre toujours aucun enregistrement de données ... D'autres idées? Je vous relèverai si vous voulez donner une autre réponse. – Giffyguy

+0

Oh, j'avais accidentellement laissé ma requête commentée ... par mauvaise. Cela fonctionne parfaitement maintenant, grâce à votre réponse! – Giffyguy

Questions connexes