Связанный DataGrid не обновляется при изменении коллекции - PullRequest
1 голос
/ 04 ноября 2011

Я нуб для WPF. Надеюсь, я смогу найти ответ.

Например, У меня есть List<Customer>, и он привязан к dataGrid. Если я добавляю нового клиента в список и не вижу сетки данных, добавьте туда новую строку.

<DataGrid ItemsSource="{Binding Customers}" AutoGenerateColumns="False" Height="318">
    <DataGrid.Columns>
        <DataGridTextColumn Header="First Name" Binding="{Binding FirstName, Mode=TwoWay}" />
        <DataGridTemplateColumn Header="Image" Width="SizeToCells" IsReadOnly="True">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Image Height="80" Source="{Binding Image,Mode=TwoWay}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Data;

namespace DataGrid
{
    public class MainWindowViewModel
    {
        public ICollectionView Customers { get; private set; }
        public ICollectionView GroupedCustomers { get; private set; }
        public List<Customer> _customers { get; set; }

        public MainWindowViewModel()
        {
            _customers = new List<Customer>
                             {
                                 new Customer
                                     {
                                         FirstName = "Christian",
                                         LastName = "Moser",
                                         Gender = Gender.Male,
                                         WebSite = new Uri("http://www.wpftutorial.net"),
                                         ReceiveNewsletter = true,
                                         Image = "Images/christian.jpg"
                                     },
                                 new Customer
                                     {
                                         FirstName = "Peter",
                                         LastName = "Meyer",
                                         Gender = Gender.Male,
                                         WebSite = new Uri("http://www.petermeyer.com"),
                                         Image = "Images/peter.jpg"
                                     },
                                 new Customer
                                     {
                                         FirstName = "Lisa",
                                         LastName = "Simpson",
                                         Gender = Gender.Female,
                                         WebSite = new Uri("http://www.thesimpsons.com"),
                                         Image = "Images/lisa.jpg"
                                     },
                                 new Customer
                                     {
                                         FirstName = "Betty",
                                         LastName = "Bossy",
                                         Gender = Gender.Female,
                                         WebSite = new Uri("http://www.bettybossy.ch"),
                                         Image = "Images/betty.jpg"
                                     }
                             };
            Customers = CollectionViewSource.GetDefaultView(_customers);
            GroupedCustomers = new ListCollectionView(_customers);
            GroupedCustomers.GroupDescriptions.Add(new PropertyGroupDescription("Gender"));         
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Reflection;

namespace DataGrid
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private new MainWindowViewModel view { get; set; }
        public MainWindow()
        {
            InitializeComponent();
            view = new MainWindowViewModel();
            DataContext = view;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            view._customers.Add(new Customer
                                {
                                    FirstName = "Lei",
                                    LastName = "Moser",
                                    Gender = Gender.Male,
                                    WebSite = new Uri("http://www.wpftutorial.net"),
                                    ReceiveNewsletter = true,
                                    Image = "Images/christian.jpg"
                                });
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace DataGrid
{    
    public enum Gender
    {
        Male, 
        Female
    }

    public class Customer : INotifyPropertyChanged
    {
        private string _firstName;
        private string _lastName;
        private Gender _gender;
        private Uri _webSite;
        private bool _newsletter;
        private string _image;

        public string FirstName
        {
            get { return _firstName; }
            set 
            {
                _firstName = value;
                NotifyPropertyChanged("FirstName");
            }
        }

        public string LastName
        {
            get { return _lastName; }
            set
            {
                _lastName = value;
                NotifyPropertyChanged("LastName");
            }
        }

        public Gender Gender
        {
            get { return _gender; }
            set
            {
                _gender = value;
                NotifyPropertyChanged("Gender");
            }
        }

        public Uri WebSite
        {
            get { return _webSite; }
            set
            {
                _webSite = value;
                NotifyPropertyChanged("WebSite");
            }
        }

        public bool ReceiveNewsletter
        {
            get { return _newsletter; }
            set
            {
                _newsletter = value;
                NotifyPropertyChanged("Newsletter");
            }
        }

        public string Image
        {
            get { return _image; }
            set
            {
                _image = value;
                NotifyPropertyChanged("Image");
            }
        }

        #region INotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
        #endregion

        #region Private Helpers
        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
    }
}

Я установил для bindingMode значение TwoWay, у меня есть button_onClick, и я просто добавляю новых клиентов в связанный список, но я не вижу, как Datagrid добавляет новую строку для него.
Кто-нибудь может помочь?

Ответы [ 2 ]

5 голосов
/ 04 ноября 2011

Проблема в том, что List<T> не реализует INotifyCollectionChanged.Без этого ничто не говорит WPF о том, что был добавлен новый элемент.

Лучшим вариантом здесь является изменение класса для использования ObservableCollection<T> вместо List<T>.Это заставит WPF автоматически получать уведомления при добавлении или удалении элементов из коллекции, и он будет обновляться соответствующим образом.

0 голосов
/ 04 ноября 2011

Ваш List объект, вероятно, не наследуется от INotiftyPropertyChanged, поэтому ваша программа не сообщает программе об обновлении объекта.

Если бы вы могли опубликовать некоторый код, мы могли бы определить, является ли онслучай или в чем причина проблемы.

...