WPF 列表视图不显示列表

本文关键字:列表 显示 视图 WPF | 更新日期: 2023-09-27 18:31:42

我有一个我正在处理的wpf MVVM项目,我正在使用棱镜,所以INotifyPropertyChanged = SetProperty。我有一个模型是投诉模型:

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; }

以及视图模型中的属性:

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

员工模型是

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); }
    }

所以我尝试添加员工:

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;
}

这会将这两名员工添加到工作小组列表,但不会更新视图。有趣的是,当我将var myList = SelectedComplaint.CrewList更改为var myList = new List<EmployeeModel>();时,它将添加 2 名员工并更新视图。我也尝试了SelectedComplaint.CrewList.Add(employee),但这没有更新视图。

如果您看到我错过的区域,请告诉我。

WPF 列表视图不显示列表

调用 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) 您Add Employee - 这会修改列表,但这不会调用CrewList的 setter - 因此,视图不会收到修改后的列表的通知

3) 将 CrewList 属性设置为 myList 变量的值。但是,请注意我在第 1 点中所说的 - myList是对同一对象的引用 - 这不会改变您的属性(如果对象未在 setter 中更改,则 Prism 可能不会通知视图)

我的建议是将List更改为ObservableCollection - 这个类有一个额外的"事件",称为NotifyCollectionChanged - 当你调用Add()Remove()等时,ObservableCollection会自动引发它。这将为您通知视图。

尝试将 CrewList 类型声明为"observablecollection"而不是"List" 当您添加每个员工时,它将更新视图。

ObservableCollection<EmployeeModel> CrewList

你需要改变

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

public ObservableCollection<EmployeeModel> CrewList {get;set}

这将自动调用集合上的 NotifyCollectionChange 事件。

这篇文章包含有关列表集合和可观察集合之间区别的更多信息。