【发布时间】:2017-10-10 18:40:27
【问题描述】:
我正在编写一个用于管理工具库存的程序,当我让用户将工具标记为“已修复”时遇到了问题。
程序应该如下工作:
使用 TIView、TIViewModel、TIModel:
- 员工检查工具。
- 工具在使用过程中碰巧损坏。
- Employee return 是将其标记为损坏并报告问题的工具。
- 该工具被标记为已退回并锁定,直到修复为止。
使用 VPRView、VPRViewModel 和 VPRModel:
- 检查员进入数据网格,显示所有有问题的工具。
检查员纠正问题,将工具标记为已修复,然后提交数据。
程序使用检查员 ID 号、他们的解决方案更新 SQLite 数据库,将问题标记为已解决并记录完成日期/时间。
问题步骤:
8.然后程序从 TIViewModel 运行 PopulateToolInventory 方法来更新库存列表,从而使工具不再被锁定。
总结:
当检查员将工具标记为已修复时,将使用 VPRView、VPRViewModel 和 VPRModel 更新数据库。在 TIViewModel 中可以找到为工具清单拉取数据的方法。通过 VPRViewModel 将数据上传到数据库后,如何让应用程序从 VPRViewModel 执行“PopulateToolInventory”方法?
代码示例:
VPRViewModel:
public void SubmitSolution()
{
VPRModel vprm = new VPRModel();
vprm.SubmitProblemSolution(ProblemSolved, ProblemSolution, InspectorID, SelectedReport[0].ToString());
ProblemReports = vprm.RetrieveProblemReports();
InspectorID = null;
ProblemSolution = null;
ProblemSolved = false;
MessageBox.Show("Solution successfully recorded!", "Success!", MessageBoxButton.OK);
// This is where I would want to call the method from the TIViewModel to update the data grid on the TIView.
}
TIViewModel:
private DataTable _toolInventory;
public DataTable ToolInventory
{
get { return _toolInventory; }
set
{
_toolInventory = value;
NotifyOfPropertyChange(() => ToolInventory);
}
}
public void PopulateToolInventory()
{
TIModel tim = new TIModel();
ToolInventory = tim.RetrieveToolInventory();
}
ShellViewModel:
class ShellViewModel : Conductor<object>
{
public void Open_ToolInventory()
{
ActivateItem(new TIViewModel());
}
public void ViewProblemReport()
{
WindowManager wm = new WindowManager();
VPRViewModel vprvm = new VPRViewModel();
wm.ShowDialog(vprvm);
}
}
仅供参考:如果这对任何解决方案有帮助,我正在使用 Caliburn.Micro。
希望这是足够的信息。如果没有,就问你需要什么!另外,请不要活着吃我的代码。我是自学成才的,我知道我离专业开发人员还很远,但这是我的热情所在,我真的很享受。感谢建设性的批评,请不要让我觉得自己很愚蠢。
【问题讨论】:
-
这看起来可能是一个解决方案。不过,一旦在 TIViewModel 上建立了 EventAggregator,我很难理解如何通过 EventAggregator 实际调用该方法。
-
TIViewModel的实例在哪里?它和VPRViewModel实例都是同一个父母的孩子吗?如果是这样,给VPRViewModel一个SolutionSubmitted事件,并让父级设置一个处理程序,使TIViewModel做它需要做的任何事情。或者你有一个视图创建自己的视图模型的方案,所以它们不能互相交谈?后者是个坏主意。它使 MVVM 倒退。不要用事件聚合器或定位器接触任何东西;这些都是拜占庭式的、不必要的杂物,旨在实现以视图为中心的设计的反模式。 -
@EdPlunkett 它们都是由 ShellViewModel 创建的。 ShellViewModel 在创建时创建 TIViewModel 和 TIView 并将它们放置在内容区域中。 VPRViewModel 和 VPRView 都是稍后通过菜单项创建的。我将更新问题以向您展示 ShellViewModel 代码。
-
如果 ShellViewModel 将它们都创建并保留对它们的引用,那么问题就很简单了。
标签: c# wpf mvvm caliburn.micro