Почему мой WPF Datagrid не показывает данные? - PullRequest
8 голосов
/ 23 марта 2009

Это пошаговое руководство говорит о том, что вы можете создать таблицу данных WPF в одну строку, но не дает полного примера.

Итак, я создал пример с использованием общего списка и соединил его с сеткой данных WPF, но он не показывает никаких данных.

Что мне нужно изменить в приведенном ниже коде, чтобы он отображал данные в сетке данных?

ОТВЕТ:

Этот код работает сейчас:

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>

Код сзади:

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" });
        }
    }
}

Ответы [ 5 ]

7 голосов
/ 11 января 2011

Обычно в WPF вы используете ObservableCollection<>

Потому что тогда вы можете просто .Add() / .Remove() элементов в / из исходной коллекции и любые элементы управления, связанные (привязка данных) автоматически обновляться (автоматическое уведомление об изменении свойства) . Это две важные концепции в WPF.

Модель с основным окном

using System.Collections.Generic;

namespace TestDatagrid345.ViewModels
{
  class Window1ViewModel
  {
    private ObservableCollection<Customer> _customers = new ObservableCollection<Customer>();
    public ObservableCollection<Customer> Customers
    {
      Get { return _customers; }
    }
  }
}

Главное окно

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" });
    }
  }
}

Главное окно 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>
3 голосов
/ 23 марта 2009

Вам нужно добавить

DataContext = Customers;

В вашем Window_Loaded ()

1 голос
/ 22 марта 2010

попробуйте: заполнить список клиентов _ и назначить свойство ItemsSource

        dataGrid1.ItemsSource = _customers;
1 голос
/ 23 марта 2009

Теперь удалите Path = Customers из вашей привязки, и она должна работать:)

0 голосов
/ 18 февраля 2019

Я пытался выяснить, почему идентичный код, указанный в ответе Джона Б., не работал для меня, и проблема заключалась в том, что объект модели (Клиент) не имел свойств, но имел поля. Преобразование их в свойства решило мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...