如何避免从构造函数调用长操作

Nes*_*tor 1 c# constructor

我使用 MVVM,并且必须创建一个 ViewModel 类,该类在打开视图时应加载大量数据。

\n

基本上,当我创建视图模型时,它应该使用数据库并获取数据。

\n

我首先使用了这种方法:

\n
public 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}\n
Run Code Online (Sandbox Code Playgroud)\n

它可以在不阻塞 UI 线程的情况下工作并加载数据。

\n

后来我发现这个关于如何使用构造函数的指南,它不建议从构造函数开始长操作。

\n
\n

\xe2\x88\x9a 在构造函数中做最少的工作。

\n

除了捕获构造函数参数之外,构造函数不应该做太多工作。\n 任何其他处理的成本都应延迟到需要时为止。

\n
\n

就我而言,打开视图时需要数据。

\n

我的第一个想法是使用事件

\n

我应该如何避免从构造函数调用长操作?最佳实践是什么?

\n

Ste*_*son 5

米格尔·卡斯特罗 (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() 方法并从那里调用长时间运行的方法即可。