Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF自定义控件中使用Unity_C#_Wpf_Unity Container - Fatal编程技术网

C# 在WPF自定义控件中使用Unity

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

我正在尝试创建一个WPF自定义控件,其中包含对在引导程序中创建的unity容器的引用-例如

原因是我希望自定义控件能够解析unity容器,以便能够使用已注册到容器的一些服务。e、 g.用户偏好服务/权利服务

到目前为止,我已经创建了自定义控件,并在代码隐藏文件中包含了以下依赖项属性

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