C# 将Unity容器传递给WPF转换器类
我是WPF的新手 我想知道如何将我的IUnityContainer类注入到只有XAML代码的ViewModel中 小更新:C# 将Unity容器传递给WPF转换器类,c#,wpf,converter,unity-container,C#,Wpf,Converter,Unity Container,我是WPF的新手 我想知道如何将我的IUnityContainer类注入到只有XAML代码的ViewModel中 小更新: 有一个名为LiveVideoTileControl的类-我已将容器添加到该类中 我的windows有一个特定的转换器: <UserControl x:Class="Driver.Test.Views.LiveVideoTileControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/pr
有一个名为LiveVideoTileControl的类-我已将容器添加到该类中 我的windows有一个特定的转换器:
<UserControl x:Class="Driver.Test.Views.LiveVideoTileControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ViewModels="clr-namespace:Driver.Test.ViewModel"
xmlns:Driver="clr-namespace:Driver.Test.DriverRelated"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" >
<UserControl.Resources>
<Driver:CameraToMediaElementConverter x:Key="converter"/>
</UserControl.Resources>
<ScrollViewer>
<Grid>
<ContentControl Content="{Binding CameraEntity,Converter={StaticResource converter}}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center">
</ContentControl>
</Grid>
</ScrollViewer>
</UserControl>
如果有人不知何故来到这里,仍然在寻找答案,这就是我在应用程序中所做的,它工作得很好。converter类的限制是,您不能通过构造函数传递对unity容器实例的引用来注入服务 在启动时在Bootstrapper类或任何其他地方注册服务(这里是Prism的Bootstrapper ConfigureContainer的一部分): 在转换器类中:
UnityContainer unityContainer = (UnityContainer)Application.Current.Resources["IoC"];
现在,您可以轻松地从Unity容器解析对象的任何实例:
service = (MyService) unityContainer.Resolve<MyService>();
service=(MyService)unityContainer.Resolve();
您必须手动执行(FactoryPattern或您喜欢的任何操作)-本文:介绍如何使用纯XAML(但仍然是手动)向属性中注入参数。我想我可以将我的2个参数包装成1,并将其作为对象发送给转换(object wrapperObj)。。不是在Convert(…)中发送1个对象,而是不-这会使您的代码不可读-您看过我链接的文章了吗?设置XAML中的转换器的属性似乎是一个不错的选择。本文讨论的是将其注入ViewModel,而不是我在视图模型中使用的静态转换器类。这种情况下的区别在哪里?一个声明为DataContext,另一个声明为Resource感谢这是一个很好的解决方案,但是在以这种方式解析UnityContainer时,我不得不稍微修改一下代码:UnityContainerExtension UnityContainer=(UnityContainerExtension)Application.Current.Resources[“IoC”]代码>解析服务时也是这样:var service=(IMyService)unityContainer.Resolve(typeof(IMyService))代码>
Application.Current.Resources.Add("IoC", this.Container);
UnityContainer unityContainer = (UnityContainer)Application.Current.Resources["IoC"];
service = (MyService) unityContainer.Resolve<MyService>();