在WPF自定义控件中使用Unity

时间:2010-10-13 13:28:03

标签: c# wpf unity-container

我正在尝试创建一个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?

2 个答案:

答案 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); }
}