2 Stimmen

WPF: Wie kann ich die Elemente in einem ItemsControl in eine andere Vorlage einschließen?

Ich habe eine ItemsControl die Elemente enthält, die jeweils eine eigene DataTemplate . Jede ViewModel Klasse in der ItemsSource leitet sich von einem gemeinsamen Vorfahren ab, der eine Header Eigentum.

Ich möchte jedes Element in eine Expander Steuerelement, aber mein Problem ist, dass ich nicht weiß, wie ich jedes "DataTemplate" in den DataContext des expandierenden Teils des Expanders übertragen kann.

Im Code sieht mein Problem folgendermaßen aus:

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-Eigenschaft auf dem Code-Behind (weil es für den Zweck dieser Frage einfach ist)

    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;
        }
    }

Die XAML des Fensters:

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

Es sieht so aus, was zwar überraschend, aber verständlich ist:

Alt-Text http://img514.imageshack.us/img514/6937/itemscontrol.png

Ich erwarte eigentlich, dass die benutzerdefinierten UserControls in den erweiterten Abschnitten angezeigt werden...

4voto

Kent Boogaart Punkte 170094

Anstelle der Einstellung der DataContext sollten Sie die Option Content :

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

Damit wird sichergestellt, dass die entsprechenden DataTemplate wird auf der Grundlage des Typs der Content .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X