WPF Prism DataGrid не обновляется

У меня проблема с DataGrid в Prism MVVM.

Когда я редактировал объект в другом окне, то создаю новое окно, при этом DataGrid не обновляется. Только запустите приложение снова помогите. Это мой код:

<DataGrid Name = "ClientsTable" IsReadOnly = "True" ItemsSource = "{Binding Path=ListOfClients, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AutoGeneratingColumn = "DataGrid_AutoGeneratingColumn" Margin = "22,10,22,55" Width = "800"/>

Часть ViewModel для этого окна:

public ListOfClientsViewModel(IClientService clientService, IEventAggregator eventAggregator)
{
    this.clientService = clientService;
    this.eventAggregator = eventAggregator;
    ListOfClients.AddRange(clientService.GetAllClientsForList());
}

private ObservableCollection<ClientForList> listOfClients = new ObservableCollection<ClientForList>();
public ObservableCollection<ClientForList> ListOfClients
{
    get { return listOfClients; }
    set { SetProperty(ref listOfClients, value); }
}

И часть модели из коллекции. Это в другом проекте.

public class ClientForList : INotifyPropertyChanged
{
    private string id;
    private string name;
    private string firstname;
    private string lastname;
    private string city;
    private DateTime createdDate;


    [DisplayName("Numer klienta")]
    public string Id
    {
        get { return id; }
        set
        {
            if (value != id)
            {
                id = value;
                OnPropertyChanged();
            }
        }
    }
    [DisplayName("Nazwa")]
    public string Name
    {
        get { return name; }
        set
        {
            if (value != name)
            {
                name = value;
                OnPropertyChanged();
            }
        }
    }
    [DisplayName("Imię")]
    public string Firstname
    {
        get { return firstname; }
        set
        {
            if (value != firstname)
            {
                firstname = value;
                OnPropertyChanged();
            }
        }
    }
    [.....]

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

И, когда я редактирую объект в другом окне, я открываю окно с DataGrid:

void ExecuteListOfClients()
{
    ListOfClients listOfClientsWindow = new ListOfClients();
    listOfClientsWindow.DataContext = new ListOfClientsViewModel(IClientService, EventAggregator);
    listOfClientsWindow.ShowDialog();
}

И данные в DataGrid старые. При перезапуске приложения данные актуальны. Помощь!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
382
3

Ответы 3

Вместо

set { SetProperty(ref listOfClients, value); }

делать

set { SetProperty(listOfClients, value); }

и вместо

ListOfClients.AddRange(clientService.GetAllClientsForList());

делать

ListOfClients = clientService.GetAllClientsForList().ToObservableCollection();

Возможно, вам потребуется реализовать расширение ToObservableCollection (). Другое решение - изменить свойство ListOfClients как обычный IList, а затем внедрить INotifyPropertyChanged внутри вашей модели представления.

SetProperty(listOfClients, value); даже не компилируется.
Haukinger 22.07.2018 13:56

Хорошо, я решил часть проблемы.

Я вырезал создание окна без ручного создания ViewModel на:

void ExecuteListOfClients()
{
    ListOfClients listOfClientsWindow = new ListOfClients();
    listOfClientsWindow.ShowDialog();
}

И в xaml ListOfClients.xaml я изменился на:

prism:ViewModelLocator.AutoWireViewModel = "True"

И теперь, после повторного открытия окна, в нем отображаются обновленные данные;)

Но проблема все еще существует. Я применил метод LoadData, который выполняется в конструкторе и присваивает данные ObservableCollection. Оно работает. Я установил для него кнопку, и после редактирования клиента я нажимаю, чтобы загрузить новые данные, но, к сожалению, ничего не происходит. В будущем я хочу, чтобы этот метод вызывался из EventAggregator после редактирования клиента, но пока я сделал кнопку для тестирования, и, к сожалению, она не работает.

Оно работает. Проблема была не в самом WPF, и, как ни странно, не в представлении. Проблема заключалась в EntityFramework. Мне пришлось изменить команду выбора данных из базы данных в коллекцию:

var clients = db.Clients.AsNoTracking().ToList();

Другие вопросы по теме