Это, вероятно, не так сложно, но я становлюсь все более и более запутанным.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, такие как:
- NameOfTemplateA
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?
Благодарим за хорошее объяснение и ссылки. :-) – Igavshne