【问题标题】:Expression Blend WP -> Create design time data from class. Issues with GenericsExpression Blend WP -> 从类创建设计时数据。泛型问题
【发布时间】:2014-12-25 16:23:36
【问题描述】:
我正在尝试在 Expression Blend 中为 WP 项目创建示例数据。
它适用于简单的类,但不适用于自定义泛型类。它可以定义数据源的结构,显示我的 ViewModel 的正确结构,但不能生成值,即 SampleData.xaml 为空。
我该如何解决这个问题,按下一些生成按钮,或者有没有其他简单的方法来创建设计时数据而无需手动编写所有内容?
我从这里http://msdn.microsoft.com/en-us/magazine/dn605875.aspx 使用了一些修改过的泛型类 NotifyTaskCompletion,这是问题的根源。这是生成的数据模式的结果
【问题讨论】:
标签:
xaml
windows-phone-7
generics
windows-phone-8
expression-blend
【解决方案1】:
最简单的做法可能是创建设计者使用的“虚拟”类型。它们将具有与您的真实类型相同的公共属性,但使用具体类型并且没有任何真实代码。他们也会有不同的名字。由于数据绑定使用duck typing,因此设计时对象与运行时对象的类型不同这一事实并不重要。例如,假设您的真实班级是:
public class GenericObject<T>
{
public T Thing { get; set; }
/* Lots of other complex code here... */
}
那么你也可以添加:
#if DEBUG
public class GenericObjectDesigner
{
public string Thing { get; set; }
/* No need for any complex code */
}
#endif
现在在 Blend 中,从 GenericObjectDesigner 类型创建一个数据源,并将 Thing 属性设置为某个字符串(例如,Lorum ipsum)。您现在可以将其拖放到您的设计表面上。
而在您的实际代码中,您使用的是非Designer 版本的类,例如:
public MainPage()
{
InitializeComponent();
this.DataContext = new GenericObject<int> { Thing = 42 };
}
只要 VS 处于 Debug 模式,这将正常工作。在 Release 模式下,应用程序仍将正确编译和运行,但您会看到有关 GenericObjectDesigner 的错误不存在于您的 XAML 文件中(您可以放心地忽略它们)。