我使用 MVVM,并且必须创建一个 ViewModel 类,该类在打开视图时应加载大量数据。
\n基本上,当我创建视图模型时,它应该使用数据库并获取数据。
\n我首先使用了这种方法:
\npublic class MainViewModel\n{\n public MainViewModel()\n {\n //set some properties\n Title = "Main view";\n //collect the data\n StartLongOperation();\n }\n\n private void StartLongOperation()\n {\n Thread t=new Thread(...);\n t.start();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n它可以在不阻塞 UI 线程的情况下工作并加载数据。
\n后来我发现这个关于如何使用构造函数的指南,它不建议从构造函数开始长操作。
\n\n\n\xe2\x88\x9a 在构造函数中做最少的工作。
\n除了捕获构造函数参数之外,构造函数不应该做太多工作。\n 任何其他处理的成本都应延迟到需要时为止。
\n
就我而言,打开视图时需要数据。
\n我的第一个想法是使用事件。
\n我应该如何避免从构造函数调用长操作?最佳实践是什么?
\n米格尔·卡斯特罗 (Miguel Castro) 在他的一门精彩的 Pluralsight 课程中谈到了这个问题的解决方案。他绑定到视图模型中名为 ViewLoaded 的属性,该属性显然会在视图加载时绑定,这反过来又会调用您长时间运行的方法。
所以这会出现在视图中(或者所有视图的基类以帮助重用):
public ViewBase()
{
// Programmatically bind the view-model's ViewLoaded property to the view's ViewLoaded property.
BindingOperations.SetBinding(this, ViewLoadedProperty, new Binding("ViewLoaded"));
}
public static readonly DependencyProperty ViewLoadedProperty =
DependencyProperty.Register("ViewLoaded", typeof(object), typeof(UserControlViewBase),
new PropertyMetadata(null));
Run Code Online (Sandbox Code Playgroud)
这是 ViewModel 基类代码:
public object ViewLoaded
{
get
{
OnViewLoaded();
return null;
}
}
protected virtual void OnViewLoaded() { }
Run Code Online (Sandbox Code Playgroud)
只需重写 ViewModel 中的 OnViewLoaded() 方法并从那里调用长时间运行的方法即可。
| 归档时间: |
|
| 查看次数: |
1218 次 |
| 最近记录: |