Свързване на дървовиден изглед към обект, а не към списък‹обект›

Това може би е много прост въпрос, но все пак не знам как да го реша.

Имам модел в моето MVVM приложение, което искам да обвържа с дървовиден изглед. Мога обаче да свържа дървовидния изглед само към списък с елементи (или в моя случай ObservableCollection). Това е моделът, който използвам в момента:

/// <summary>
/// Represents an group a character can belong to.
/// </summary>
public class OrganisationBase : ModelBase<OrganisationBase>
{
    /// <summary>
    /// The name.
    /// </summary>
    private string name;

    /// <summary>
    /// The parent organization.
    /// </summary>
    private ObservableCollection<OrganisationBase> parentOrganizations;

    /// <summary>
    /// Gets or sets the name of the organization.
    /// </summary>
    public string Name
    {
        get
        {
            return this.name;
        }

        set
        {
            this.name = value;
            this.NotifyPropertyChanged(p => p.Name);
        }
    }

    /// <summary>
    /// Gets or sets the parent organization.
    /// </summary>
    public ObservableCollection<OrganisationBase> ParentOrganizations
    {
        get
        {
            return this.parentOrganizations;
        }

        set
        {
            this.parentOrganizations = value;
            this.NotifyPropertyChanged(p => p.ParentOrganizations);
        }
    }
}

Сега въпросът ми е: Как мога да свържа този модел към моя дървовиден изглед, без да използвам Observable колекции. Искам да направя това, защото няма нужда от ObservableCollection, тъй като всяка организация може да има само един родител.

Или как мога да свържа следния код към моя дървовиден изглед:

/// <summary>
/// Represents an group a character can belong to.
/// </summary>
public class OrganisationBase : ModelBase<OrganisationBase>
{
    /// <summary>
    /// The name.
    /// </summary>
    private string name;

    /// <summary>
    /// The parent organization.
    /// </summary>
    private OrganisationBase parentOrganizations;

    /// <summary>
    /// Gets or sets the name of the organization.
    /// </summary>
    public string Name
    {
        get
        {
            return this.name;
        }

        set
        {
            this.name = value;
            this.NotifyPropertyChanged(p => p.Name);
        }
    }

    /// <summary>
    /// Gets or sets the parent organization.
    /// </summary>
    public OrganisationBase ParentOrganizations
    {
        get
        {
            return this.parentOrganizations;
        }

        set
        {
            this.parentOrganizations = value;
            this.NotifyPropertyChanged(p => p.ParentOrganizations);
        }
    }
}

Това е кодът на дървовидния изглед, който използвам в момента:

<TreeView ItemsSource="{Binding Path=Character.CharacterAllegiances.MemberOf}">
  <TreeView.ItemContainerStyle>
    <Style TargetType="{x:Type TreeViewItem}">
      <Setter Property="IsExpanded"
              Value="True" />
    </Style>
  </TreeView.ItemContainerStyle>
  <TreeView.ItemTemplate>
    <HierarchicalDataTemplate ItemsSource="{Binding ParentOrganizations}">
      <TextBlock Text="{Binding Name}" />
    </HierarchicalDataTemplate>
  </TreeView.ItemTemplate>
</TreeView>

Забележка: Свойството Организация е част от символен модел. Въпреки това, когато използвам ObservableCollections, всичко се показва добре. Въпреки това, както ме попитаха по-горе, искам да отхвърля тази ObservableCollections.

Поздрави Ruhrpottpatriot


person Ruhrpottpatriot    schedule 21.04.2013    source източник


Отговори (2)


TreeView очаква колекция от елементи, за да изгради своите възли, това очевидно е правилният начин и доста разбиращо се.

Свързването на дървовидния изглед към един обект ще работи само ако този обект се изложи като колекция, напр. внедрява IEnumerable по този начин дървовидният изглед ще използва изпълнението IEnumerable за попълване на данните.

Като алтернатива можете просто да се свържете с колекция срещу обекта, напр.

<TreeView ItemsSource="{Binding object.SomeCollection}" />
person Clint    schedule 21.04.2013
comment
Добре, изглежда, че мога да се обвържа само с нещо, което излага IEnumerator. Благодаря за пояснението. Ще преосмисля средствата за съхраняване на тази информация, може би ще измисля по-добра система. - person Ruhrpottpatriot; 22.04.2013

Трябва да използвате HierarchicalDataTemplate.

Свързване на обекти на папка към дървовиден изгледСвързване на файлови обекти към дървовиден изглед

За да обвържете данни (напр. папки и файлове, както по-горе), можете да се обърнете към тази публикация: WPF Treeview: обвързване на данни на хетерогенни типове данни с помощта на клас CompositeCollection

person David    schedule 21.04.2013