WPF: Как я могу обернуть элементы в ItemsControl в другой шаблон? - PullRequest
2 голосов
/ 10 октября 2009

У меня есть ItemsControl, который содержит элементы, каждый из которых имеет свои DataTemplate. Каждый класс ViewModel в ItemsSource происходит от общего предка, обладающего свойством Header.

Я хочу обернуть каждый элемент в Expander элементе управления, но моя проблема в том, что я не знаю, как «перенести» каждый «DataTemplate» в DataContext расширяющейся части Expander.

В коде моя проблема выглядит так:

VieModels:

public class VM { public string Name { get; set; } }
public class VM1 : VM { public string Description { get; set; } }
public class VM2 : VM { public string Sakkie { get; set; } }

Свойство Items в выделенном фрагменте кода (поскольку это просто для целей этого вопроса)

    public IEnumerable<VM> Items
    {
        get
        {
            yield return new VM1() { Name = "First VM1", Description = "First VM1 Description" };
            yield return new VM2() { Name = "Vm2, nr2", Sakkie = "sakkie sakkie boeredans" } ;
            yield break;
        }
    }

XAML окна:

<Window.Resources>
    <DataTemplate DataType="{x:Type local:VM1}">
        <local:VM1UC />
    </DataTemplate>
    <DataTemplate DataType="{x:Type local:VM2}">
        <local:VM2UC />
    </DataTemplate>
    <DataTemplate x:Key="DataTemplate1">
        <Expander Header="{Binding Name}">
            <ContentPresenter DataContext="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}"/>
        </Expander>
    </DataTemplate>
</Window.Resources>
<ItemsControl ItemsSource="{Binding Items}" Background="LightCoral" ItemTemplate="{DynamicResource DataTemplate1}"/>

Это выглядит удивительно, но понятно:

альтернативный текст http://img514.imageshack.us/img514/6937/itemscontrol.png

Я ожидаю, что пользовательские элементы управления UserControls будут отображаться в расширенных разделах ...

1 Ответ

4 голосов
/ 10 октября 2009

Вместо установки DataContext, вы должны установить Content:

<ContentPresenter Content="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}"/>

Это обеспечит разрешение DataTemplate в зависимости от типа Content.

...