Nano Hash - криптовалюты, майнинг, программирование

Связанный DataGrid не обновляется при изменении коллекции

Я новичок в 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 добавил для него новую строку.
Может ли кто-нибудь помочь?

04.11.2011

Ответы:


1

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

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

04.11.2011
  • Да, это работает. Спасибо. В чем разница между ObservableCollection‹T› и INotifyCollectionChanged? 04.11.2011
  • @retide: ObservableCollection<T> — это просто коллекция в структуре, которая реализует INotifyCollectionChanged. Наличие реализации коллекции INotifyCollectionChanged является ключом к выполнению этой работы. 04.11.2011

  • 2

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

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

    04.11.2011
  • На самом деле проблема заключается в том, что List<T> не реализует INotifyCollectionChanged. Реализация INotifyPropertyChanged не исправит это, если только OP не вызовет событие изменения свойства для списка каждый раз, когда добавляется элемент (что будет обновлять привязки КАЖДОГО элемента в списке и быть немного медленнее, чем необходимо). 04.11.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..