2016-01-25 3 views
0

У меня есть проект MVP MVP, который я работаю, я использую призму, чтобы INotifyPropertyChanged = SetProperty. У меня есть модель, которая ComplaintModel:WPF Listview не отображает список

public class ComplaintModel:BindableBase, IDataErrorInfo 
{ 
    private Person _complaintPerson; 
    private List<EmployeeModel> _crewList; 

    public string MyStreet { get; set; } 
    public string Complaint { get; set; } 
    public string Response { get; set; } 
    public DateTime? DateOfResponse { get; set; } 
    public DateTime EntryDate { get; set; } 
    public bool? Callout { get; set; } 
    public string Quad { get; set; } 
    public string Tap { get; set; } 
    public DateTime? Modified { get; set; } 

    public Person ComplaintPerson 
    { 
     get { return _complaintPerson; } 
     set { SetProperty(ref (_complaintPerson), value); } 
    } 

    public List<EmployeeModel> CrewList 
    { 
     get { return _crewList; } 
     set { SetProperty(ref (_crewList), value); } 
    } 

    public int ComplaintID { get; set; } 

и свойство в ViewModel:

private ComplaintModel _selectedComplaint; 
public ComplaintModel SelectedComplaint 
{ 
    get { return _selectedComplaint; } 
    set { SetProperty(ref (_selectedComplaint), value); } 
} 

EmployeeModel является

public class EmployeeModel:BindableBase,IDataErrorInfo 
{ 
    private string _phone; 
    private string _firstName; 
    private string _lastName; 
    public int Id { get; set; } 

    public string FirstName 
    { 
     get { return _firstName; } 
     set { SetProperty(ref(_firstName),value); } 
    } 

    public string LastName 
    { 
     get { return _lastName; } 
     set { SetProperty(ref(_lastName),value); } 
    } 

    public string Phone 
    { 
     get { return _phone; } 
     set { SetProperty(ref (_phone), value); } 
    } 

Поэтому я стараюсь addEmployee:

private void AddEmployee() 
{ 

    if (SelectedEmployee == null) 
    { 
     SetMessage(Messages.ChooseEmployeeMessage); 
     return; 
    } 
    if (IsReadOnly) 
    { 
     SetMessage(Messages.MakeEditableMessage); 
     return; 
    } 
    if (SelectedComplaint.CrewList == null) 
    { 
     SelectedComplaint.CrewList = new List<EmployeeModel>(); 
    } 

    var myList = SelectedComplaint.CrewList; 
    var employee = new EmployeeModel() {FirstName = "James", Id = 1, LastName = "Tays", Phone = "1234567"}; 
    myList.Add(employee); 
    employee = new EmployeeModel() { FirstName = "John", Id = 2, LastName = "Doe", Phone = "1234567" }; 
    myList.Add(employee); 
    SelectedComplaint.CrewList = myList; 
    SelectedEmployee = null; 
} 

Это добавляет два e mworksees в CrewList, но не обновляет представление. Самое смешное, когда я меняю var myList = SelectedComplaint.CrewList на var myList = new List<EmployeeModel>();, он добавит 2 сотрудников и обновит представление. Я также пробовал SelectedComplaint.CrewList.Add(employee), и это не обновляло представление.

, пожалуйста, дайте мне знать, если вы видите область, которую я пропустил.

ответ

1

Вызов Add не будет рассматриваться как изменение свойства. Вот почему: Когда вы делаете:

var myList = SelectedComplaint.CrewList; 
    var employee = new EmployeeModel() {FirstName = "James", Id = 1, LastName = "Tays", Phone = "1234567"}; 
    myList.Add(employee); 
    employee = new EmployeeModel() { FirstName = "John", Id = 2, LastName = "Doe", Phone = "1234567" }; 
    myList.Add(employee); 
    SelectedComplaint.CrewList = myList; 

Вы:

1) Вызов геттер в CrewList. Это возвращает ссылку на объект _crewList

2) Вы AddEmployee - это изменяет список, но это не вызывает сеттер из CrewList - таким образом, вид не уведомляется модифицированного списка

3) Вы задаете для свойства CrewList значение переменной myList. Но обратите внимание на то, что я сказал в пункте 1 - myList является ссылкой на тот же объект - это не изменит вашу собственность (возможно, Prism не уведомляет мнение, если объект не изменяется в сеттере)

Мое предложение изменить List на ObservableCollection - в этом классе есть дополнительное событие "NotifyCollectionChanged", которое автоматически поднимает ObservableCollection, когда вы звоните Add(), Remove() и т. д. Это уведомит вас об этом.

1

Попробуйте объявить тип CrewList как «наблюдаемый коллекций» вместо «Список». Он обновит представление при добавлении каждого сотрудника.

ObservableCollection<EmployeeModel> CrewList 
+0

спасибо, что сделал! :) – JamTay317

0

Вам нужно изменить

public List<EmployeeModel> CrewList 
{ 
    get { return _crewList; } 
    set { SetProperty(ref (_crewList), value); } 
} 

в

public ObservableCollection<EmployeeModel> CrewList {get;set} 

Это будет автоматически вызывать событие NotifyCollectionChange на коллекции.

This Опубликовать дополнительную информацию о различии между списком и наблюдаемыми коллекциями.

Смежные вопросы