У меня проблема с 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 старые. При перезапуске приложения данные актуальны. Помощь!





Вместо
set { SetProperty(ref listOfClients, value); }
делать
set { SetProperty(listOfClients, value); }
и вместо
ListOfClients.AddRange(clientService.GetAllClientsForList());
делать
ListOfClients = clientService.GetAllClientsForList().ToObservableCollection();
Возможно, вам потребуется реализовать расширение ToObservableCollection (). Другое решение - изменить свойство ListOfClients как обычный IList, а затем внедрить INotifyPropertyChanged внутри вашей модели представления.
Хорошо, я решил часть проблемы.
Я вырезал создание окна без ручного создания 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();
SetProperty(listOfClients, value);даже не компилируется.