我在寻求一些建议。我已经创建了大量的WPF用户控件,它们都必须使用一个名为TcAdsClient的类。此类将始终在使用这些用户控件之一的项目中使用。
为了获得对该类的引用,我在每个用户控件中设置了一个名为init(TcAdsClient)的方法。然后,对于使用的每个控件,当MainWindow加载并通过传递对类的引用时,我调用此方法。
有没有一种方法可以让我在不调用方法或通过构造函数传递的情况下获得引用。在某种程度上,我希望用户控件假设类将一如既往地可用。
希望这能说得通
BR
克里斯
发布于 2014-12-12 23:45:10
考虑一个依赖注入框架(Prism,MEF)。你在bootstrapper中初始化这个类,每当它出现在你的控件的构造函数中时,框架就会负责注入它。虽然你仍然需要在构造函数中添加它,但整个初始化过程已经为你完成了(没有风险,它在被访问时不会被初始化)。
我知道将整个解决方案迁移到Prsim只是因为这有点夸张,但很可能它也会为你在其他地方的应用程序架构提供更多好处。由于您已经遇到了组合问题,这可能是一个线索,您可以从这种架构更改中受益。
我知道这是一个非常笼统的回答,但既然你是在寻求建议,而不是一个具体的实现,我希望它仍然可以有所帮助。
发布于 2014-12-12 23:36:00
一个想法:
创建一个接口,该接口将包含所需类的属性:
public interface IMyClass
{
MyClass TheClassINeed { get; }
}在要放置控件的窗体中,实现类。
public partial class MainWindow : Window, IMyClass
{
public MyClass TheClassINeed { get; set; }
}在控件中选择一个事件,以搜索实现IMyClass的父级并获取接口。
如果您在XAML中有表单的名称,则可以使用以下代码:
IMyClass interfElem = null;
UIElement element = sender;
for(;;)
{
element = VisualTreeHelper.GetParent(element) as UIElement;
if (element == null)
break;
interfElem = element as IMyClass;
if (interfElem == null)
continue;
break;
}另一种可能是创建一个包含类的静态字段的静态类。当创建窗体时,您可以在其中存储您的类,并且每个自定义控件都可以查看它。或者甚至是包含类的不同实例的Dictionary,这些实例带有一个标记,您的控件可以与之相关。
编辑
但是我认为这种行为会导致更大的错误代码。对我来说,包含一个属性要“自然”得多,在这个属性中,代码将设置您想要传递给控件的对象,并让控件处理是否提供了该对象。
https://stackoverflow.com/questions/27446408
复制相似问题