Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
.net 如何将依赖项注入WPF中的用户控件_.net_Wpf_Wpf Controls - Fatal编程技术网

.net 如何将依赖项注入WPF中的用户控件

.net 如何将依赖项注入WPF中的用户控件,.net,wpf,wpf-controls,.net,Wpf,Wpf Controls,在WPF中透明地向用户控件注入依赖项(使用IOC容器)的最佳方法是什么 我假设用户控件是窗口或其他用户控件的XAML的一部分。 我也认为父母(无论是谁)不应该对此负责。从父级手动注入依赖项的解决方案看起来不够干净。我希望避免显式地管理组件的依赖关系,因为它体现了IOC的思想 是否有任何在创建逻辑树时引发的事件,以便我可以拦截它并注入依赖项 编辑: 所谓依赖关系,我还指ViewModel、Controller、Presenter(无论使用何种模式) 谢谢, Andrey处理WPF中依赖关系的最佳方

在WPF中透明地向用户控件注入依赖项(使用IOC容器)的最佳方法是什么

我假设用户控件是窗口或其他用户控件的XAML的一部分。 我也认为父母(无论是谁)不应该对此负责。从父级手动注入依赖项的解决方案看起来不够干净。我希望避免显式地管理组件的依赖关系,因为它体现了IOC的思想

是否有任何在创建逻辑树时引发的事件,以便我可以拦截它并注入依赖项

编辑: 所谓依赖关系,我还指ViewModel、Controller、Presenter(无论使用何种模式)

谢谢,
Andrey

处理WPF中依赖关系的最佳方法是遵循以下步骤


简而言之,您不会将依赖项直接注入用户控件(视图),而是注入它们的(视图模型)。

FrameworkElement有一个初始化的事件,您可以连接并注入依赖项。您应该测试它对于您的场景是否足够早。

我这样做的方式是使用一个整体应用程序类,将依赖项注入到您的viewmodel类中(假设您使用的是MVVM设计模式?)-使用类似Unity的DI容器。请参阅WPF应用程序框架(),其中包含您正在描述的此类场景的示例。

我也遇到了这种思维障碍:

我也认为父母(不管是谁) 我不应该对此负责


那么谁会呢?IoC的观点是,其他东西(父对象、视图模型、某些东西等)定义了依赖关系。

解决问题的可能方法之一是采用“视图模型优先”的方法,并使用约定而不是配置。

当然,但ViewModel只是依赖关系的一个例子,所以如何将ViewModel注入用户控件?设置DataContext属性。从父控件?这意味着父级应该能够为用户控制创建ViewModel(使用对容器或抽象工厂的访问)。我也不喜欢父母照顾孩子的想法——这违反了国际奥委会的理念。无论如何,我现在就是这样做的,但我在寻找更好的方法。ViewModel是我视图的一个实现细节,理想情况下,甚至没有人应该知道它的存在(包括控件父级的ViewModel)。我不想每次将控件放入XAML时都要初始化control.ViewModel。理想情况下…我不知道您是如何从应用程序访问用户控件的。无论如何,这就是我想要避免的——管理依赖项。依赖项的注入可以由像Unity这样的依赖项容器来处理。我不知道您的具体情况,但看起来您没有使用数据绑定(更不用说MVVM了)?如果是这样的话,我建议您进一步研究这些方面——WPF的强大之处在于这些技术。不,我使用的是MVVM,但这并不重要。使用IOC容器注入依赖关系的问题是有原因的(同样,不管是哪一个容器)。看起来这是在执行view ctor时发生的(从InitializeComponent)_container.Resolve()mainView.Initialized+=mainView_Initialized;//从不发生mainView.Show();我知道,但他正在寻找的是一个简洁的解决方案,可以触发
IoC
容器注入这些依赖项。这篇文章如何充分回答这个问题?使用viewmodel首先与为用户控件指定ctor参数有什么关系?