C# 在WPF自定义控件中使用Unity
我正在尝试创建一个WPF自定义控件,其中包含对在引导程序中创建的unity容器的引用-例如 原因是我希望自定义控件能够解析unity容器,以便能够使用已注册到容器的一些服务。e、 g.用户偏好服务/权利服务 到目前为止,我已经创建了自定义控件,并在代码隐藏文件中包含了以下依赖项属性C# 在WPF自定义控件中使用Unity,c#,wpf,unity-container,C#,Wpf,Unity Container,我正在尝试创建一个WPF自定义控件,其中包含对在引导程序中创建的unity容器的引用-例如 原因是我希望自定义控件能够解析unity容器,以便能够使用已注册到容器的一些服务。e、 g.用户偏好服务/权利服务 到目前为止,我已经创建了自定义控件,并在代码隐藏文件中包含了以下依赖项属性 public static readonly DependencyProperty ContainerProperty = DependencyProperty.Register("Container", typeo
public static readonly DependencyProperty ContainerProperty = DependencyProperty.Register("Container", typeof(UnityContainer), typeof(SomeCustomWPFControl), new PropertyMetadata("DefaultTestValue"));
public UnityContainer Container
{
get { return (UnityContainer)GetValue(ContainerProperty); }
set { SetValue(ContainerProperty, value); }
}
在我试图包含自定义控件的WPF表单中,我在参考资料区域添加了以下行:
<Unity:UnityContainer x:Key="unitContainer"></Unity:UnityContainer>
在表单it's self中,我尝试创建自定义控件:
<Globe:SomeCustomWPFControl Container="{DynamicResource unitContainer}" DockPanel.Dock="Right" x:Name="JimEditor1" Grid.Column="0" Grid.Row="3"></Globe:SomeCustomWPFControl>
我在运行时收到的唯一错误信息是
标记文件“[assembly name]”中的对象“System.Windows.Controls.Grid”处出错;[路径/文件].xaml'第135行位置22
有没有关于我错在哪里的建议?Thx
完整Xaml:
<UserControl x:Class="DB.GPF.Globe.Views.JimTestPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Globe="clr-namespace:DB.GPF.Globe"
xmlns:Unity="clr-namespace:Microsoft.Practices.Unity;assembly=Microsoft.Practices.Unity">
<UserControl.Resources>
<Unity:UnityContainer x:Key="unitContainer"></Unity:UnityContainer>
</UserControl.Resources>
<Grid>
<Globe:SomeCustomWPFControl Container="{DynamicResource unitContainer}" x:Name="JImTestControl1"></Globe:SomeCustomWPFControl>
</Grid>
更新:问题似乎是UnityContainer或IUnityContainer类型的DependencyProperty,如果该类型更改为内置的.Net类型,例如string,则运行正常。知道为什么我们不能拥有UnityContainer或IUnityContainer类型的DependencyProperty吗?我认为,在自定义控件中嵌入Unity不是一个好主意
<Globe:SomeCustomWPFControlContainer="{DynamicResource unitContainer}" DockPanel.Dock="Right" x:Name="JimEditor1" Grid.Column="0" Grid.Row="3"></Globe:SomeCustomWPFControlContainer>
如果您需要更改custome控件的某些属性,而不是公开这些属性并更改它们您可以发布Xaml的其余部分吗?这里是完整的Xaml:感谢您的快速响应,您当然是正确的,我在代码中更改了这一点,但没有任何效果,因为我假设它在使用getter之前失败。我认为错误是由于运行时找不到unity控制器,但无法确定如何将其正确地包含在资源区域中。其想法是,在控件创建期间,它将使用服务获取应用于该控件的首选项和权限。即,如果以英国/美国格式显示日期,则当前用户是否可以放弃该控件。等等…如果不在代码中嵌入unity,就不能更改这些属性吗?我之所以这么说是因为如果你在你的控件中嵌入了unity,你的控件本身就取决于unity,如果将来你需要用其他DI提供者来替换unity,而不是改变你的自定义控件,我认为这不是一个好的建议,剩下的是你的代码,你可以在其中做你想做的:)saurabh是对的。您不应该在代码中添加容器。我总是反对它。容器应该将对象和值注入到你的控件中。谢谢你的回复,伙计们,但我不理解你目前对此的反对意见。使用unity的想法是允许我将来以真正的IoC风格使用的服务实现发生变化。@Jim我相信反对意见来自这样一个事实,即您将对给定服务实现的依赖替换为对容器本身的依赖。例如,更好的做法是让自定义控件接受
IPreferenceServer
,并在控件外部使用Unity容器解析IPreferenceServer
实现,然后将服务注入控件。
public UnityContainer Container
{
get { return (UnityContainer)GetValue(ContainerProperty); }
set { SetValue(ContainerProperty, value); }
}