我正在尝试创建一个WPF自定义控件,其中包含对BootStrapper中创建的统一容器的引用 - 例如
原因是我希望自定义控件能够解析统一容器,以便能够使用已注册到容器的某些服务。例如用户偏好服务/权利服务。
到目前为止,我已经创建了自定义控件,并在代码隐藏文件中包含以下依赖项属性
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表单中,我已将以下行添加到Resources区域:
<Unity:UnityContainer x:Key="unitContainer"></Unity:UnityContainer>
在自己的形式中,我试图创建自定义控件:
<Globe:SomeCustomWPFControl Container="{DynamicResource unitContainer}" DockPanel.Dock="Right" x:Name="JimEditor1" Grid.Column="0" Grid.Row="3"></Globe:SomeCustomWPFControl>
我在运行时收到的唯一错误信息是
标记文件'[程序集名称]中的对象'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类型,例如字符串然后运行正常。有什么想法我们不能拥有UnityContainer或IUnityContainer类型的DependencyProperty?
答案 0 :(得分:1)
我认为,在自定义控件中嵌入Unity并不是一个好主意。
如果您需要更改您的客户控制的某些属性,而不是公开这些属性并更改它们
答案 1 :(得分:0)
<Globe:SomeCustomWPFControlContainer="{DynamicResource unitContainer}" DockPanel.Dock="Right" x:Name="JimEditor1" Grid.Column="0" Grid.Row="3"></Globe:SomeCustomWPFControlContainer>
在<Globe:SomeCustomWPFControlContainer
之后你的xaml出现了问题。你错过了要绑定的属性。
编辑:你的获取价值也是错误的。你有GetValue(GetValue(ContextMenuProperty)),它应该是......
public UnityContainer Container
{
get { return (UnityContainer)GetValue(ContainerProperty); }
set { SetValue(ContainerProperty, value); }
}