将Dispatcher注入ViewModel - 重构Unity - 属性注入

时间:2016-02-29 18:28:58

标签: c# dependency-injection unity-container win-universal-app prism

我正在尝试使用Unity和Prism将我的ShellPage的Dispatcher注入到我的ViewModel中。因为在创建shell之后调度程序可用,所以我无法及时注册调度程序 第一步:

 protected override Task OnInitializeAsync(IActivatedEventArgs args)
        {
            [...]
            Container.RegisterInstance<IResourceLoader>(resourceLoader);

其次,将执行CreateShell方法。

protected override UIElement CreateShell(Frame rootFrame)
        {
            var shell = Container.Resolve<ShellPage>();
            Container.RegisterType<MyViewModel>(new InjectionProperty(nameof(MyViewModel.Dispatcher), shell.Dispatcher));

虽然我将Dispatcher注入MyViewModel到属性Dispatcher为null。也许我需要在MEF中重新组合一些东西?如何在MyViewModel中实现属性注入?

1 个答案:

答案 0 :(得分:0)

我认为不可能。 不支持像MEF那样重新组合。

简单的方法是创建一个帮助程序来获取当前视图的Dispatcher并在ViewModels中使用它

请看这个例子: http://mikaelkoskinen.net/post/fixing-coredispatcher-invoke-how-to-invoke-method-in-ui-thread-in-windows-8-release-preview

此示例适用于Windows 8,但您可以将其用于UWP应用

当我使用这种方法时,我对UWP应用做了一些小改动:

在app.xaml.cs中的Onlaunched事件

我在另一个地方添加了UIDispatcher。

 if (rootFrame.Content == null)
        {
            // When the navigation stack isn't restored navigate to the first page,
            // configuring the new page by passing required information as a navigation
            // parameter

            UIDispatcher.Initialize();
            rootFrame.Navigate(typeof(MainPage), e.Arguments);
        }
        // Ensure the current window is active
        Window.Current.Activate();