Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 视图中的异步依赖项注入_C#_Wpf_Asynchronous_Dependency Injection_View - Fatal编程技术网

C# 视图中的异步依赖项注入

C# 视图中的异步依赖项注入,c#,wpf,asynchronous,dependency-injection,view,C#,Wpf,Asynchronous,Dependency Injection,View,我正在尝试使用存储库模式来管理WPF应用程序中的服务访问 因此,基本上我计划使用Ninject将我的Singleton ServiceManager注入到每个需要它的视图中 我构建了ServiceManager,因此每个方法调用都是异步的 public partial class OffersView : UserControl { public OffersView(ISvcManager svcManager) { InitializeComponent()

我正在尝试使用存储库模式来管理WPF应用程序中的服务访问

因此,基本上我计划使用Ninject将我的Singleton ServiceManager注入到每个需要它的视图中

我构建了ServiceManager,因此每个方法调用都是异步的

 public partial class OffersView : UserControl
{
    public OffersView(ISvcManager svcManager)
    {
        InitializeComponent();
        Offers.ItemsSource = await svcManager.GetLatestOffers();
    }
}
现在我遇到了一个难题。我正在创建一个包含DataGrid的视图,该视图由一个缓慢的、非同步的方法填充。目前我在构造函数中有调用,但我显然不能使构造函数异步

 public partial class OffersView : UserControl
{
    public OffersView(ISvcManager svcManager)
    {
        InitializeComponent();
        Offers.ItemsSource = await svcManager.GetLatestOffers();
    }
}
我可以想出几种方法来解决这个问题,例如我可以将接口分为快速方法和慢速方法,并且只对慢速方法使用异步,而同步快速方法是在构造函数中调用的方法。但不确定这是否是最好的使用方法——在哪里调用长时间运行的方法来填充datagrid

或者,我在其中放置一个Wait(),并仅在完成后设置ItemSource。我真的不喜欢那种方法


那么我应该如何设置这个呢?

使用异步事件处理程序,比如
Loaded
,它将允许异步调用

比如说

public partial class OffersView : UserControl {
    private readonly ISvcManager svcManager;
    public OffersView(ISvcManager svcManager) {
        this.svcManager = svcManager;
        InitializeComponent();
        Loaded += onLoaded;
    }

    private async void onLoaded(Object sender, RoutedEventArgs e) {
        Loaded -= onLoaded; // Unsubscribe to prevent repeated firing.
        Offers.ItemsSource = await svcManager.GetLatestOffers();
    }
}