2016-01-01 2 views
1

Это, вероятно, не так сложно, но я становлюсь все более и более запутанным.WPF, TreeView, привязка к свойствам внутри объекта в коллекции

Я хочу показать TreeView в моем представлении, но я не могу получить привязку данных прямо.

Коллекция TemplateFamilyList является корневым объектом. Он будет содержать список объектов TemplateFamily. Каждый из этих объектов TemplateFamily будет содержать объект Template и список объектов TemplateParameter, называемых TemplateParameterMembers. Фактический класс Template и фактический класс TemplateParameter имеют свойство Name среди других свойств.

Итак, в моем классе ViewModel у меня есть этот метод, заполняющие коллекции:

public void LoadTemplateTree() 
    { 
     TemplateFamilyList = new ObservableCollection<TemplateFamily>(); 

     List<Template> templateList = BuilderService.GetAllTemplates(); 
     List<TemplateParameter> templatesParametersList; 

     foreach (Template template in templateList) 
     { 
      templatesParametersList = BuilderService.GetATemplatesParameters(template.TemplateID); 
      TemplateFamilyList.Add(new TemplateFamily(template, new ObservableCollection<TemplateParameter>(templatesParametersList)));    
     } 
    } 

Вот класс TemplateFamily:

public class TemplateFamily 
{ 
    public Template Template { get; set; } 

    public ObservableCollection<TemplateParameter> TemplateParameterMembers { get; set; } 

    public TemplateFamily(Template aTemplate, ObservableCollection<TemplateParameter> templatesParameters) 
    { 
     Template = aTemplate; 
     TemplateParameterMembers = templatesParameters; 
    } 
} 

То, что я хотел бы это в TreeView, такие как:

  1. NameOfTemplateA
  2. NameOfTemplateB

    • NameOfTemplateParameterB1
    • NameOfTemplateParameterB2

т.д.

В моем XAML у меня есть это: (но это не работает, это дает некоторый пустой TreeView только с стрелками но нет имен).

<TabItem Header="Template Files" Height="22" VerticalAlignment="Top"> 
      <TreeView Height="Auto" Name="treeView1" Width="Auto" ItemsSource="{Binding TemplateFamilyList}"> 
       <TreeView.ItemTemplate> 
        <HierarchicalDataTemplate ItemsSource="{Binding TemplateParameterMembers}" > 
         <TextBlock Text="{Binding Path=Name}" Margin="2" ></TextBlock> 
        </HierarchicalDataTemplate > 
       </TreeView.ItemTemplate> 
      </TreeView> 
     </TabItem> 

The ViewModel связан с видом с ViewModelLocator, и она отлично работает и в других случаях. Я знаю, что если я привяжусь к TemplateFamilyList, он получит правильный объект, я просто не знаю, как показать имя каждого TemplateFamily в этом списке (который должен быть именем свойства свойства Template объекта TemplateFamily) и то для следующего уровня в дереве, если есть список TemplateParameterMembers, как показать свойство Name свойства TemplateParameter каждого элемента в коллекции TemplateParameterMembers.

Я предполагаю, что я мог бы попытаться иметь другое свойство Name в классе TemplateFamily, а просто дублирует свойство Имя шаблона в конструкторе, такие как:

public TemplateFamily(Template aTemplate, ObservableCollection<TemplateParameter> templatesParameters) 
    { 
     Template = aTemplate; 
     Name = aTemplate.Name; 
     TemplateParameterMembers = templatesParameters; 
    } 

, но мне не нравится этот подход, и к тому же , У меня нет специального класса «контейнера» для коллекции TemplateParameters, поэтому мне все равно нужно как-то развернуть и получить свойство Name TemplateParameter в каждом элементе коллекции TemplateParameterMembers.

Я видел этот post и кажется, что в ответ, Gishu использует DataType атрибуты, такие как:

DataType="{x:Type local:Group} 

локальное пространство имен определяется в ОП поста:

xmlns:local="clr-namespace:TaskManager.Domain;assembly=TaskManager.Domain" 

Однако , в моем случае классы Template и TemplateParameter являются частью моей модели, они даже не в том же проекте, что и ViewModel и View. я это, насколько мое локальное пространство имен идет:

xmlns:local="clr-namespace:S.VisualStudioExtension"   
     local:ViewModelLocator.AutoWireViewModel="True" 

Должен ли я затем добавить пространство имен для классов шаблонов и TemplateParameter, такие как:

xmlns:domain="clr-namespace:S.ModelDomain" 

и попытаться использовать это в ТипДанных атрибут?

Я также подозреваю, что что-то не так с моим XAML, возможно, у меня должен быть другой Иерархический DataTemplate?

ответ

1

Лучшим и наиболее универсальным (на мой взгляд) решением в этой ситуации является определение шаблона для каждого типа элементов, которые будут представлены в дереве, и поместить их в словарь ресурсов дерева. Каждый шаблон должен быть связан с соответствующим типом элемента, используя свойство DataType. Таким образом, подходящий шаблон будет автоматически выбран для представления каждого элемента в зависимости от его типа. Предполагая, что ваш TemplateParameter класса определен в проекте под названием S.ModelDomain в пространстве имен S.ModelDomain и local префикса правильно определен в вашем XAML, это должно дать вам ожидаемый результат (я взял на себя смелость разборки Вашего XAML неактуальных атрибутов):

<TreeView xmlns:models="clr-namespace:S.ModelDomain;assembly=S.ModelDomain" 
      ItemsSource="{Binding TemplateFamilyList}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:TemplateFamily}" 
            ItemsSource="{Binding TemplateParameterMembers}" > 
      <TextBlock Text="{Binding Template.Name}" /> 
     </HierarchicalDataTemplate> 
     <DataTemplate DataType="{x:Type models:TemplateParameter}"> 
      <TextBlock Text="{Binding Name}" /> 
     </DataTemplate> 
    </TreeView.Resources> 
</TreeView> 

Общепринятой практикой является определение сопоставлений пространств имен в корневом элементе XAML (обычно Window или UserControl). См. Больше здесь: XAML Namespaces and Namespace Mapping for WPF XAML.

Обратите внимание, что у шаблонов нет значения x:Key, несмотря на то, что он помещается в словарь ресурсов. Это требование, чтобы шаблон учитывался при автоматическом выборе шаблона. Этот тип шаблонов называется неявных шаблонов. Вот полезная ссылка на это: Data Templating Overview.

+0

Благодарим за хорошее объяснение и ссылки. :-) – Igavshne

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