DataTemplate用于数组或IEnumerable

时间:2012-02-24 01:51:57

标签: c# wpf visual-studio-2010 xaml datatemplate

我想创建一个隐式Da​​taTemplate,它适用于我的类的数组或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();
    }
}

2 个答案:

答案 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}" />
相关问题