【发布时间】:2021-02-07 11:17:41
【问题描述】:
在我的 WPF MVVM 项目中,我有一些表单和一个保存员工信息的数据库。有一个员工视图模型,这有一个 employeeId 传递给它,使用员工模型,员工的详细信息从数据库中读取。这也会读取员工是“用户”还是“管理员”。
然后视图模型将决定加载哪个视图。用户视图或管理员视图。这两个视图之间有很多相似之处,这就是为什么我对两者都使用相同的视图模型。
这就是为什么对于我的项目,我决定保持一致并让我的视图模型打开它们的视图。但是,在网上研究我只能看到建议说要实例化视图,然后在视图构造函数中创建视图模型。
我的方法对 MVVM 来说是错误的方式吗?我该如何以正确的方式处理这种情况?
MainWindowViewModel:
public void OpenSelectedEmployee(object employee)
{
if (employee == null)
return;
StaffListModel model = (StaffListModel)employee;
EmployeeViewModel vm = new EmployeeViewModel(model.EmployeeId);
}
EmployeeViewModel:
private EmployeeModel employee;
private Window employeeWindow;
// Employee View Model Constructor
public EmployeeViewModel(int employeeId)
{
// Connect to DB and read data for employee class
if (LoadEmployee(employeeId))
{
if (employee.UserType == "User")
employeeWindow = new EmployeeUserDetailsView();
else // if Admin
employeeWindow = new EmployeeAdminDetailsView();
employeeWindow.DataContext = this;
employeeWindow.ShowDialog();
}
else
{
// Open error message
MessageBox.Show("Error loading employee occurred");
}
}
我已经考虑将用户类型存储在主窗口视图模型中,以便决定打开哪个视图。但是,如果出于某种原因数据库无法读取员工 (LoadEmployee(employeeId)),则创建视图毫无意义,我希望显示错误消息框。
编辑:
这是EmployeeViewModel 中当前的LoadEmployee 方法。它在构造函数中使用,并通过绑定按钮刷新表单。
public bool LoadEmployee(int employeeId)
{
if (!DbConnector.OpenDB())
return false;
try
{
employee = EmployeeModel.FindById(employeeId);
Depots = DepotModel.FindAllShort();
Departments = EmployeeModel.FindAllDepartments();
TenureHistory = TenureHistoryModel.FindAllByEmployeeId(employeeId);
IdCards = IdCardModel.FindAllByEmployeeId(employeeId);
Qualifications = QualificationModel.FindAllByEmployeeId(employeeId);
TheoryBookings = TheoryBookingModel.FindAllByEmployeeId(employeeId);
MedicalRecords = MedicalRecordModel.FindAllByEmployeeId(employeeId);
EyesightChecks = EyesightCheckModel.FindAllByEmployeeId(employeeId);
}
catch
{
DbConnector.CloseDB();
return false;
}
DbConnector.CloseDB();
return true;
}
public void Refresh(object parameter)
{
if (!LoadEmployee(employee.EmployeeId))
MessageBox.Show("An error has occurred");
NotifyPropertyChanged(string.Empty);
}
【问题讨论】: