2013-02-28 3 views
1

Я хотел бы построить TreeView так:TreeView с несколькими типами

People 
Person 1 
    Relatives 
     Relative 1 
     Relative 2 
    Mom 
    Dad 
    Pets 
     Pet 1 
     Pet 2 

Проблема заключается в том, что у человека есть 2 списка (родственников и домашних животных) и двух отдельных элементов (мама и папа). Я довольно хорошо знаком с HierarchicalDataTemplates, но я не понял способ сделать это - есть много примеров, но никто, кажется, не смешивает подобные типы.

Чтобы сделать вещи еще более интересными, могут быть люди без мамы или папы (грустно, но верно). Этот список должен будет отразить это.

Данные Im используются из базы данных с использованием структуры сущностей, поэтому мой список людей уже имеет правильную структуру, и я предпочел бы, чтобы у меня не было всех моих объектов из какого-либо общего составного объекта (также во многих примеры), где у каждого есть «Имя» и «Дети». Я хотел бы использовать естественные свойства каждого объекта, такие как MomsFirstName, PersonName, в привязках к моим данным.

Возможно ли это?

+0

Это звучит как ваш класс Person, а другие связанные с ним объекты находятся в вашем слое модели. Хотя он точно моделирует данные из вашей базы данных, это не обязательно облегчает подготовку данных для представления. Я предлагаю перевести вашу модель в ViewModel с полной иерархией, используя интерфейсы и/или базовые классы. – EtherDragon

+0

@EtherDragon Yup. Если данные нуждаются в подготовке, я обязательно буду использовать виртуальную машину. Но если это не так, я стараюсь избегать виртуальных машин для этих типов. Но в этом случае в обоих случаях проблема одинакова для treeview. – Nicros

ответ

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

Вы можете заменить это шаблонами данных на основе типов, используя свойство ['DataType'] (http://msdn.microsoft.com/en-us/library/system.windows.datatemplate.datatype.aspx) ... –

0

Вы пытались использовать ItemTemplate и ItemTemplateSelector?

Смежные вопросы