This walkthrough says you can create a WPF datagrid in one line but doesn't give a full example.
So I created an example using a generic list and connected it to the WPF datagrid, but it doesn't show any data.
What do I need to change on the code below to get it to show data in the datagrid?
This code works now:
XAML:
<Window x:Class="TestDatagrid345.Window1"
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"
xmlns:local="clr-namespace:TestDatagrid345"
Title="Window1" Height="300" Width="300" Loaded="Window_Loaded">
<StackPanel>
<toolkit:DataGrid ItemsSource="{Binding}"/>
</StackPanel>
</Window>
Code Behind:
using System.Collections.Generic;
using System.Windows;
namespace TestDatagrid345
{
public partial class Window1 : Window
{
private List<Customer> _customers = new List<Customer>();
public List<Customer> Customers { get { return _customers; }}
public Window1()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DataContext = Customers;
Customers.Add(new Customer { FirstName = "Tom", LastName = "Jones" });
Customers.Add(new Customer { FirstName = "Joe", LastName = "Thompson" });
Customers.Add(new Customer { FirstName = "Jill", LastName = "Smith" });
}
}
}
try it: populate you _customers list and asign property ItemsSource
dataGrid1.ItemsSource = _customers;
Typically in WPF, you would leverage an ObservableCollection<>
Because then you can just .Add()
/ .Remove()
elements to/from the source collection, and any controls bound (Data Binding) automatically get updated (Automatic Property Change Notification). Those are 2 important concepts in WPF.
Main Window View Model
using System.Collections.Generic;
namespace TestDatagrid345.ViewModels
{
class Window1ViewModel
{
private ObservableCollection<Customer> _customers = new ObservableCollection<Customer>();
public ObservableCollection<Customer> Customers
{
Get { return _customers; }
}
}
}
Main Window
using System.Collections.Generic;
using System.Windows;
namespace TestDatagrid345
{
public partial class Window1 : Window
{
Window1ViewModel _viewModel;
public Window1()
{
InitializeComponent();
_viewModel = (Window1ViewModel)this.DataContext; // @#$% (see XAML)
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// but this stuff could instead be done on a 'Submit' button click on form:
_viewModel.Customers.Add(new Customer { FirstName = "Tom", LastName = "Jones" });
_viewModel.Customers.Add(new Customer { FirstName = "Joe", LastName = "Thompson" });
_viewModel.Customers.Add(new Customer { FirstName = "Jill", LastName = "Smith" });
}
}
}
Main Window XAML
<Window
x:Class="TestDatagrid345.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:TestDatagrid345.ViewModels"
Title="Window1"
Height="350"
Width="525"
WindowState="Maximized">
<Window.DataContext>
<vm:Window1ViewModel /> <!-- this needs to be here for @#$% -->
</Window.DataContext>
<Grid>
<DataGrid
AutoGenerateColumns="True"
ItemsSource="{Binding Path=Customers}"
AlternatingRowBackground="LightBlue"
AlternationCount="2" />
</Grid>
</Window>
I was trying to figure out why the identical code as given by JohnB's answer did not work for me, and the problem was that the model object (Customer) did not have properties, but fields. Converting them to properties fixed my problem.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With