Reputation: 2067
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:
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
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
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