我想构建一个这样的树视图:
People
Person 1
Relatives
Relative 1
Relative 2
Mom
Dad
Pets
Pet 1
Pet 2
问题是一个人有2个名单(亲戚和宠物)和两个单项(妈妈和爸爸)。我对HierarchicalDataTemplates非常熟悉,但我还没有找到一种方法来做到这一点 - 那里有很多例子,但似乎没有像这样混合类型。
为了让事情变得更有趣,可能会有没有妈妈或爸爸的人(悲伤却是真实的)。该清单需要反映这一点。
使用的数据源自使用实体框架的数据库,因此我的人员列表已经具有正确的结构 - 我宁愿不让所有对象派生自一些常见的复合对象(在许多示例中也是如此) )每个人都有'姓名'和'儿童'。我想在我的datatemplates的绑定中使用每个对象的自然属性,如MomsFirstName,PersonsName。
这可能吗?
答案 0 :(得分:0)
不确定这是否对您有所帮助,但您可以提供自己的模板选择器,以便为每种类型选择不同的模板;它们都将由您选择的ItemsPanelTemplate对象封装,但它允许您对指定的任何类型具有非常不同的控件。这是我的用例,但我想你可以将同样的想法应用到TreeView
<ItemsControl>
<ItemsControl.Resources>
<DataTemplate x:Key="templateFoo">
</DataTemplate>
<DataTemplate x:Key="templateBar">
</DataTemplate>
<DataTemplate x:Key="templateJoe">
</DataTemplate>
</ItemsControl.Resources>
<ItemsControl.ItemTemplateSelector>
<local:MyTemplateSelector></local:MyTemplateSelector>
</ItemsControl.ItemTemplateSelector>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Grid.Row"
Value="{Binding Row}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
这就是某个地方
public class MyTemplateSelector: DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element == null || item == null)
return null;
if(item is Foo)
{
return element.FindResource("templateFoo") as DataTemplate;
}
if (item is Bar)
{
return element.FindResource("templateBar") as DataTemplate;
}
if (item is Joe)
{
return element.FindResource("templateJeo") as DataTemplate;
}
return null;
}
}
答案 1 :(得分:0)
您是否尝试过使用ItemTemplate和ItemTemplateSelector?