Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I define my own columns in a WPF DataGrid?

I've got an AutoGenerateColumns WPF-DataGrid getting bound in code-behind to LINQ-to-SQL, which works fine.

But when I take off the AutoGenerateColumns and define my own columns, it tells me "The items collection must be empty before using ItemsSource."

But I'm not binding the ItemSource in my XAML so I don't see why it isn't empty. What do I need to change so that I can define my own columns?

XAML:

<UserControl x:Class="TestDataGrid566.AppPages.ManageCustomers"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
             Loaded="UserControl_Loaded">
    <toolkit:DataGrid x:Name="TheDataGrid" 
                      CanUserAddRows="False"
                      AlternatingRowBackground="#ddd"
                      CanUserSortColumns="true"
                      PreviewKeyDown="TheDataGrid_PreviewKeyDown"
                      AutoGenerateColumns="False"
                      RowEditEnding="TheDataGrid_RowEditEnding">

        <toolkit:DataGridTextColumn Header="Contact Name" Width="SizeToCells"  
                                    Binding="{Binding ContactName}" 
                                    IsReadOnly="False"/>
    </toolkit:DataGrid>
</UserControl>

code-behind:

public partial class ManageCustomers : UserControl
{
    private NorthwindDataContext _db = new NorthwindDataContext();

    public ManageCustomers()
    {
        InitializeComponent();
    }

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        LoadData();
    }

    public void LoadData()
    {
        var customers = from c in _db.Customers
                        select c;
        TheDataGrid.ItemsSource = customers.ToList();
    }
}
like image 274
Edward Tanguay Avatar asked Mar 24 '09 17:03

Edward Tanguay


1 Answers

You're trying to put the column directly into the DataGrid (therefore it's trying to put the column in the grid's Items collection and that explains your error). You need to put it inside the Columns collection:

<toolkit:DataGrid x:Name="TheDataGrid" 
                          CanUserAddRows="False"
                          AlternatingRowBackground="#ddd"
                          CanUserSortColumns="true"
                          PreviewKeyDown="TheDataGrid_PreviewKeyDown"
                          AutoGenerateColumns="False"
                          RowEditEnding="TheDataGrid_RowEditEnding">
    <toolkit:DataGrid.Columns>        
        <toolkit:DataGridTextColumn Header="Contact Name" Width="SizeToCells"  
                                       Binding="{Binding ContactName}" 
                                       IsReadOnly="False"/>
    </toolkit:DataGrid.Columns>
</toolkit:DataGrid>
like image 149
Kent Boogaart Avatar answered Sep 19 '22 09:09

Kent Boogaart