Привязка данных элемента управления WPF DataGrid к объекту System.Data.DataTable? - PullRequest
1 голос
/ 11 июля 2009

Что мне нужно сделать, чтобы мой элемент управления WPF DataGrid связывался с объектом DataTable?

Я страдал из-за этого уже несколько дней. Даже если привязка и запрос работают правильно, и в таблице есть наблюдаемые данные - в сетке данных ничего не отображается.

Мой код 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, доступен WPF Toolkit здесь . Установите его, добавьте ссылку на WPFToolkit.dll [который появится в «Добавить ссылку» диалоговое окно «.NET»] и предоставьте объявление пространства имен XML [в моем XAML выше] для использования элемента управления WPF DataGrid.)

1 Ответ

5 голосов
/ 11 июля 2009

InitializeComponent() создаст экземпляр вашей разметки, включая привязку. В этот момент DTUsers по-прежнему null, поэтому ничего не отображается. Затем вы изменяете DTUsers, но привязка (и, следовательно, сетка) не может узнать, что вы это сделали, и поэтому она ничего не делает.

Вы должны либо сделать DTUsers свойством зависимости, либо внедрить INotifyPropertyChanged в своем классе и вызвать событие PropertyChanged после изменения значения свойства.

...