2009-10-10 28 views
2

我有一个ItemsControl,其中包含每个都有自己的项目DataTemplate。 ItemsSource中的每个ViewModel类都来自具有Header属性的共同祖先。WPF:如何将ItemsControl中的项目包装到另一个模板中?

我想包装每个项目在Expander控制,但我的问题是,我不知道如何将每个'DataTemplate''继承'到扩展器的explobal部分的DataContext。

在代码中,我的问题是这样的:

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

上的项目属性代码隐藏(因为它是简单的为这个问题的目的)

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

我其实希望自定义用户控件在扩展部分展现出来......

回答

4

而不是设置DataContext的,您应该设置Content

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

这将确保适当的DataTemplate解决基于叔他类型的Content

+0

哇!完美解决方案,谢谢! (upvote两次按钮在哪里?) –

相关问题