Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
262 views
in Technique[技术] by (71.8m points)

c# - Why isn't my WPF Datagrid showing data?

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?

ANSWER:

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" });
        }
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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>

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...