DataTemplate для массива или IEnumerable - PullRequest
2 голосов
/ 24 февраля 2012

Я хотел бы создать неявный DataTemplate, который работает с массивом или IEnumerable моего класса.Таким образом, у меня есть шаблон, который описывает, как визуализировать группу элементов вместо одного.Я хочу сделать это, чтобы я мог, среди прочего, показать результаты во всплывающей подсказке.например,

<TextBlock Text="{Binding Path=CustomerName}" ToolTip="{Binding Path=Invoices}">

Подсказка должна видеть, что Счета-фактуры - это набор элементов, и использовать соответствующий шаблон данных.Шаблон будет выглядеть примерно так:

<DataTemplate DataType="{x:Type Customer[]}">
    <ListBox "ItemsSource={Binding}">
     etc

Это не сработало, поэтому я попробовал пример из этого поста x: Тип и массивы - как? , который включает в себя создание пользовательскихрасширение разметки.Это работает, если вы указываете ключ, но не для неявного шаблона

Итак, я попытался создать собственное расширение разметки, наследуемое от TypeExtension, как показано ниже, но я получаю сообщение об ошибке «Ключ для словаря не можетвведите 'System.Windows.Controls.StackPanel'. Поддерживаются только String, TypeExtension и StaticExtension. "Это действительно странная ошибка, так как она принимает содержимое таблицы данных в качестве ключа ??Если я укажу ключ, то он будет работать нормально, но это в значительной степени противоречит цели.

[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 ]

3 голосов
/ 24 февраля 2012

Как отмечено в вопросе, который вы связали с {x:Type ns:TypeName[]} , работает .Он может перевернуть дизайнер, но во время выполнения все должно быть хорошо.

Чтобы избежать ошибок дизайнера, шаблон можно переместить в App.xaml или словарь ресурсов (или, конечно, просто не использовать дизайнер вообще).

(Ошибка с упоминанием элемента управления внутри шаблона звучит как ошибка в генераторе кода или компиляторе, к сожалению, я сомневаюсь, что с этим можно многое сделать).

2 голосов
/ 24 февраля 2012

Если у вас все в порядке с созданием собственного типа, я просто попробовал и следил, и это работает.Создайте определенный тип для своей коллекции:

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}" />
...