2009-07-10 17 views
1

WPF DataGridコントロールをDataTableオブジェクトにバインドするには、何が必要ですか?System.Data.DataTableオブジェクトへのWPF DataGridコントロールのデータバインディング?

私はこれ以上数日間苦しんできました。バインドとクエリの両方が正しく機能し、テーブルに観測可能なデータがある場合でも、データグリッドには何も表示されません。

私のXAMLコードはこのようになります。

<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> 

私のC#のコードビハインドはこのようになります。
(DAOは私のデータアクセスオブジェクトである)

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. 
    } 
} 

私は出力をチェックしましたし、バインディングエラーはありません。
これはなぜコンパイルされて実行されますが、データは表示されません。

(DataGridコントロールの場所がわからない場合は、hereがあります。インストールし、WPFToolkit.dllへの参照を追加します。[参照の追加]ダイアログの[.NET "]、WPF DataGridコントロールを使用するための[上記のXAMLのXML名前空間宣言]を提供してください)。

答えて

5

InitializeComponent()はバインディングを含めてマークアップをインスタンス化します。その時点でDTUsersはまだnullなので、何も表示されません。その後、DTUsersを変更しますが、バインディング(したがってグリッド)がそれを行ったことを知る方法はないため、何もしません。

DTUsersを依存プロパティに設定するか、クラスにINotifyPropertyChangedを実装し、プロパティの値を変更した後にPropertyChangedイベントを発生させる必要があります。

+0

これは理にかなっています!ありがとう、トン! – Giffyguy

+0

Hmm --- InitializeComponent()をコンストラクタの一番下に移動しましたが、少なくともDataGridは適切な列と列ヘッダーでデータを取り込めますが、データレコードはまだ表示されません。他のアイデア?もう一度答えたいと思ったら、もう一度投票します。 – Giffyguy

+0

ああ、私は誤ってクエリをコメントアウトしたままだった...悪い。それはあなたの答えのおかげで今、完璧に動作します! – Giffyguy

関連する問題