WPF:如何将ItemsControl中的项目包装在另一个模板中?

时间:2009-10-10 09:08:22

标签: wpf data-binding xaml datatemplate

我有一个ItemsControl,其中包含每个都有自己DataTemplate的项目。 ItemsSource中的每个ViewModel类都派生自一个具有Header属性的共同祖先。

我想将每个项目包装在Expander控件中,但我的问题是我不知道如何将每个'DataTemplate''延续'到Expander的expading部分的DataContext。 / p>

在代码中,我的问题看起来像这样:

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

看起来像这样,令人惊讶,但可以理解:

alt text http://img514.imageshack.us/img514/6937/itemscontrol.png

我实际上期望自定义UserControls显示在展开的部分中......

1 个答案:

答案 0 :(得分:4)

您应该设置DataContext

,而不是设置Content
<ContentPresenter Content="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}"/>

这将确保根据DataTemplate的类型解决相应的Content