gpt4 book ai didi

具有参数化构造函数的 Wpf 用户控件

转载 作者:行者123 更新时间:2023-12-03 00:57:52 25 4
gpt4 key购买 nike

我们正在使用 Microsoft Unity 和依赖项注入(inject),因此我们为用户控件提供了参数化构造函数。如何使用 XAML 将此依赖项注入(inject)到用户控件中?

我已在 XAML 中添加了用户控件,如下所示。

xmlns:usrRefundArrivalProcessor="Ttl.Refunds.Wpf.Dashboad.Application.Usercontrols;assembly=Ttl.Refunds.Wpf.Dashboad.Application"

最佳答案

依赖注入(inject)并不意味着参数化构造函数。事实上,如果你看一下Unity自带的示例,大部分依赖注入(inject)都是通过带有[Dependency]属性的属性来完成的。

Unity 与 XAML 配合得很好,但前提是您不使用参数化构造函数。使用带有 [Dependency] 属性的属性转换您的 UserControl 以获取其依赖项,并且您可以轻松使用 XAML。

public class MyUserControl : UserControl
{
[Dependency]
public ISomething Something { get; set; }

[Dependency]
public IWhatever Whatever { get { return (IWhatever)GetValue(WhateverProperty); } set { SetValue(WhateverProperty, value); }
public readonly DependencyProperty WhateverProperty = DependencyProperty.Register("Whatever", typeof(IWhatever), typeof(MyUserControl));

...
}

请注意,[Dependency] 属性可以声明为 DependencyProperty 或普通 CLR 属性,如上所示。这听起来像是令人困惑的术语,但实际上它非常简单。

要在 XAML 中指定 UnityContainer 并获得自动配置,只需创建一个继承的附加属性“UnityHelper.Container”,其 PropertyChangedCallback 只需在指定容器上调用 BuildUp 并传入对象的类型和对象:

public class UnityHelper
{
public static IUnityContainer GetContainer(DependencyObject obj) { return (IUnityContainer)obj.GetValue(ContainerProperty); }
public static void SetContainer(DependencyObject obj, IUnityContainer value) { obj.SetValue(ContainerProperty, value); }
public static readonly DependencyProperty ContainerProperty = DependencyProperty.RegisterAttached("Container", typeof(IUnityContainer), typeof(UnityHelper), new FrameworkPropertyMetadata
{
Inherits = true,
PropertyChangedCallback = (obj, e) =>
{
var container = e.NewValue as IUnityContainer;
if(container!=null)
{
var element = obj as FrameworkElement;
container.BuildUp(obj.GetType(), obj, element==null ? null : element.Name);
}
}
});
}

现在您可以将 UnityContainer 分配给您的根窗口,并且您的整个应用程序将使用它,例如您可以在窗口的构造函数中执行此操作,如下所示:

UnityHelper.SetContainer(this, new UnityContainer() ...);

或者您可以使用 XAML 在树的任何所需级别分配统一容器:

<UserControl ...
my:UnityHelper.Container="{DynamicResource MainUnityContainer}" />

话虽如此,我想您会发现 WPF 的高级数据绑定(bind)功能和资源字典一起消除了人们最初想要使用 Unity 的 98% 的原因。从长远来看,您可能会发现放弃 Unity 并使用简单的 MVVM 会更好。至少,在开发大量依赖 Unity 进行依赖注入(inject)的代码之前,我会在测试应用程序上尝试纯 MVVM,看看它是如何工作的。

关于具有参数化构造函数的 Wpf 用户控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2744282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com