我想创建一个隐式DataTemplate,它适用于我的类的数组或IEnumerable。这样我就有了一个模板来描述如何渲染一堆项而不是一个。我想这样做,所以除其他外,我可以在工具提示中显示结果。例如
<TextBlock Text="{Binding Path=CustomerName}" ToolTip="{Binding Path=Invoices}">
工具提示应该看到Invoices是一堆项目并使用适当的数据模板。模板看起来像这样:
<DataTemplate DataType="{x:Type Customer[]}">
<ListBox "ItemsSource={Binding}">
etc
这没用,所以我尝试了这篇帖子x:Type and arrays--how?中的示例,其中涉及创建自定义标记扩展。如果您指定密钥而不是隐式模板
,则此方法有效然后我尝试制作我自己的自定义标记扩展,继承自TypeExtension,如下所示但是我收到一条错误,上面写着“字典的键不能是'System.Windows.Controls.StackPanel'类型。只有字符串,TypeExtension,和StaticExtension是支持的。“这是一个非常奇怪的错误,因为它将datatemplate的内容作为关键??如果我指定一个键,那么它工作正常,但这很大程度上违背了目的。
[MarkupExtensionReturnType(typeof(Type)), TypeForwardedFrom("PresentationFramework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
public class ArrayTypeExtension
: TypeExtension
{
public ArrayTypeExtension() : base() { }
public ArrayTypeExtension(Type type) : base(type)
{
}
public ArrayTypeExtension(string value) : base(value)
{
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
Type val = base.ProvideValue(serviceProvider) as Type;
return val == null ? null : val.MakeArrayType();
}
}
答案 0 :(得分:3)
如您在{x:Type ns:TypeName[]}
链接的问题中所述。它可能会让设计师失望,但在运行时它应该没问题。
为了避免设计师错误,可以将模板移动到App.xaml或资源字典(当然也就是根本不使用设计器)。
(在模板中提到控件的错误听起来像代码生成器或编译器中的错误,遗憾的是我怀疑你可以做很多关于那个。)
答案 1 :(得分:2)
如果您可以创建自己的类型,我只是尝试并关注它并且它正在工作。为您的收藏品创建特定类型:
public class InvoiceCollection : List<Invoice> { }
public class Customer {
public string name { get; set; }
InvoiceCollection invoices { get; set; }
}
然后是带有数据模板的XAML:
<DataTemplate DataType={x:Type InvoiceCollection}>
<ListBox ItemsSource="{Binding}" />
</DataTemplate>
<TextBox Text="{Binding name}" Tooltip="{Binding invoices}" />