harikrishnan.n0077
harikrishnan.n0077

Reputation: 2067

DataTable binding to DataGrid WPF

XAML file:

<DataGrid ItemsSource="{Binding Items}" x:Name="ItemsDataGrid" Margin="0,30,0,0" AutoGenerateColumns="True">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Sl. No." MinWidth="125" />
        <DataGridTextColumn Header="Name" MinWidth="200" />
        <DataGridTextColumn Header="Total Quantity" MinWidth="200" />
        <DataGridTextColumn Header="Remaining" MinWidth="200" />
        <DataGridTextColumn Header="Cost/Each" MinWidth="200" />
    </DataGrid.Columns>
</DataGrid>

XAML.CS File:

private void Page_Loaded_1(object sender, RoutedEventArgs e)
{
    _itemsViewModel = new ItemsViewModel();
    this.DataContext = _itemsViewModel;
}

ViewModel.cs file:

private DataTable _itemsList;
private List<ItemsModel> ItemsModel;

public DataTable ItemsList
{
    get { return _itemsList; }
    set
    {
        _itemsList = value;
        OnPropertyChanged("ItemsList");
    }
}

private List<ItemsModel> _items;

public List<ItemsModel> Items
{
    get { return _items; }
    set
    {
        _items = value;
        OnPropertyChanged("Items");
    }
}

public ItemsViewModel()
{
    LoadItems();
}

private void LoadItems()
{
    CFunctions cFunctions = new CFunctions();
    ItemsList = cFunctions.GetItems();
    ItemsModel = new List<ItemsModel>();
    for (int i = 0; i < ItemsList.Rows.Count; i++)
    {
        ItemsModel.Add(new ItemsModel()
        {
            SlNo = int.Parse(ItemsList.Rows[i].ItemArray[0].ToString()),
            ItemName = ItemsList.Rows[i].ItemArray[1].ToString(),
            Quantity = int.Parse(ItemsList.Rows[i].ItemArray[2].ToString()),
            Remaining = int.Parse(ItemsList.Rows[i].ItemArray[3].ToString()),
            Cost = int.Parse(ItemsList.Rows[i].ItemArray[4].ToString())
        });

    }
    Items = ItemsModel;
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    var handler = PropertyChanged;
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}

Model.cs file:

class ItemsModel
{
    public int SlNo        { get; set; }
    public int Quantity    { get; set; }
    public int Cost        { get; set; }
    public int Remaining   { get; set; }
    public String ItemName { get; set; }
}

If AutoGenerateColumns="True" it creates columns and adds the data to those created columns like:

enter image description here

When it is false the DataGrid is Empty.

Is it the correct way i am doing? Why does it not bind to the columns already created?

Upvotes: 0

Views: 1075

Answers (2)

blindmeis
blindmeis

Reputation: 22445

like Digitlafront says, you need to set the binding

<DataGrid ItemsSource="{Binding Items}" x:Name="ItemsDataGrid" Margin="0,30,0,0"
         AutoGenerateColumns="False">
   <DataGrid.Columns>
     <DataGridTextColumn Binding="{Binding SlNo, Mode=OneWay}" Header="Sl. No." MinWidth="125" />
     <DataGridTextColumn Binding="{Binding ItemName}" Header="Name" MinWidth="200" />
     <DataGridTextColumn Binding="{Binding Quantity} Header="Total Quantity" MinWidth="200" />
     <DataGridTextColumn Binding="{Binding Remaining} Header="Remaining" MinWidth="200" />
     <DataGridTextColumn Binding="{Binding Cost} Header="Cost/Each" MinWidth="200" />
   </DataGrid.Columns>
  </DataGrid>

you also should set the Mode=TwoWay or OneWay as you need it. Instead of a List i would use ObservableCollection.

Upvotes: 1

Tyler Day
Tyler Day

Reputation: 1718

You are missing the:

Binding="{Binding Description}"

Attributes on each column definition. You have to explicitly link them to your model class properties.

Upvotes: 3

Related Questions