我有一个ItemsControl
,其中包含每个项目都有自己的DataTemplate
。 ItemsSource 中的每个 ViewModel
类都派生自具有 Header
属性的共同祖先。
我想将每个项目包装在 Expander
控件中,但我的问题是我不知道如何将每个“DataTemplate”“结转”到扩展部分的 DataContext扩展器。
在代码中,我的问题如下所示:
VieModel:
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
我实际上希望自定义用户控件出现在扩展部分中......
最佳答案
您应该设置Content
,而不是设置DataContext
:
<ContentPresenter Content="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}"/>
这将确保根据 Content
的类型解析适当的 DataTemplate
。
关于WPF:如何将 ItemsControl 中的项目包装在另一个模板中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1547450/