Мои автоматически созданные столбцы не отображаются в датагриде

Кажется, что большинство сообщений относительно DataGrid AutoGenerateColumns имеют дело с тем, как обойти поведение по умолчанию. К сожалению, по умолчанию это то, с чем я борюсь.

У меня есть несколько таблиц базы данных, созданных с помощью Entity Framework 6.0, и я хотел бы отобразить их в моем представлении, используя одну и ту же сетку данных для всех таблиц и автоматическое создание столбцов. Желаемый результат: для зависящей от класса Viewmodel, связанной во время выполнения, отобразите столбцы с заголовками и хотя бы одну строку.

XAML пользовательского элемента управления View:

<UserControl.Resources>
    <DataTemplate x:Key="TableDataTemplate">
        <DataGrid
            AutoGenerateColumns="True"
            GridLinesVisibility="All"
            HorizontalScrollBarVisibility="Visible"
            VerticalScrollBarVisibility="Visible">
        </DataGrid>
    </DataTemplate>
</UserControl.Resources>

<StackPanel Height="720" Width="980">
    <!-- shows user which menu item was chosen -->
    <TextBlock Text="{Binding DisplayName}"/>

    <!-- defines the Input data grid for adding to DB table -->
    <Grid Height="80" MaxHeight="200">
        <ItemsControl
            ItemsSource="{Binding CurrentDataTable}" 
            ItemTemplate="{StaticResource TableDataTemplate}">
        </ItemsControl>
    </Grid>

Пользовательский элемент управления привязан к классу Class'TableViewModel, реализованному для всех таблиц базы данных. Один пример:

class ClientsAdminTableViewModel : TableViewModel
{
    // the Property the view binds to
    private IList<Client> currentDataTable;

    public ObservableCollection<Client> CurrentDataTable
    {
        get { return CollectionExtensions.ToObservableCollection<Client>(currentDataTable); }
        set { currentDataTable = value; OnPropertyChanged("CurrentDataTable")}
    }

    public ClientsAdminTableViewModel()
    {
        DisplayName = Strings.ClientAdminDisplayName;
        currentDataTable = context.Clients.ToList<Client>();
    }

При связывании с {Binding CurrentDataTable} этот код создает пользовательский интерфейс, в котором я вижу серое тело (возможно, строки), окруженное горизонтальной и вертикальной полосами прокрутки, поверх которой одна длинная строка (которая должна быть строкой заголовка), но нет колонны.

Любая помощь приветствуется.

2 ответа

Решение

Этот код теперь работает (Спасибо, Дж. Кинг!) Хитрость заключалась в том, чтобы избавиться от шаблона данных, создать сетку данных прямо в сетке с точно такими же связывающими утверждениями.

    <StackPanel Height="720" Width="980">
        <!-- shows user which menu item was chosen -->
        <TextBlock Text="{Binding DisplayName}"/>

        <!-- defines the Input data grid for adding to DB table -->
        <Grid Height="200" MaxHeight="400">

            <DataGrid 
                ItemsSource="{Binding CurrentDataTableNew}" 
                AutoGenerateColumns="True"
                GridLinesVisibility="All" 
                HorizontalScrollBarVisibility="Visible" 
                VerticalScrollBarVisibility="Visible" >
            </DataGrid>
        </Grid>
    </userControl>

Ваша сетка данных должна иметь свой набор источников данных

попробуйте добавить

ItemsSource="{Binding CurrentDataTable}"

к декларации сетки данных. Кроме того, вы получаете какие-либо ошибки привязки в окне вывода?

Другие вопросы по тегам