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)
,但这没有更新视图。
如果您看到我错过的区域,请告诉我。
调用 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 事件。
这篇文章包含有关列表集合和可观察集合之间区别的更多信息。