由于WPF中的UserControl必须具有无参数构造函数,因此为它们提供构造时“接近”所需的相当复杂数据的正确方法是什么。我已经尝试过为此使用依赖项属性,但是我遇到了一些问题,因为Visual Studio设计人员试图将Dictionary<string,MyObject>
之类的东西传递给IDictionary<string,MyObject>
类型的依赖项属性。在某些时候,它必须要一个精确的编译时类型匹配,否则XAML不会出现在设计器中,尽管应用程序执行得很好。
基本上,我想要一种很好的方法来传递我通常会将构造函数传递给用户控件的东西。什么是最好的方式?
更新: 有问题的用户控件将始终从XAML创建,因此除了无参数构造之外,具有非参数构造不是一种选择。
更新2: 一个有趣的想法是从无参数构造函数中获取可以从中获取初始化数据的内容。可能会问一个问题:我已经初始化的祖先中哪一个实现了一个IMyDataProvider接口?这可能与祖先类型绑定的相对源的工作方式类似,除非从用户控件构造函数以编程方式完成。
答案 0 :(得分:2)
如果您遇到的唯一问题是传入派生类型,则可以传入一个包含复杂类型作为属性的简单具体容器类。例如:
public class InitializationData
{
public IDictionary<TKey, TValue> Dictionary { get; set; }
}
此级别的间接将克服Visual Studio设计器的限制。
答案 1 :(得分:1)
有两种选择。
1,您可以拥有多个构造函数,一个无参数的构造函数,用于通过XAML创建控件时的构造函数,另一个构造函数在您通过代码直接创建控件时获取一组参数。如果您肯定不想通过代码创建实例,那么......
2,添加一个只有一个setter的公共属性,并使用您要传入的确切字典类型进行定义,并用作初始化控件的数据。该属性只需要调用一次。您可以使用其他属性作为getter / setter,以按更多泛型类型公开初始化数据。