Silverlight 3 - Доступ к родительскому объекту TreeView Item - PullRequest
0 голосов
/ 07 мая 2009

Я использую TreeView вместе с HierarchicalDataTemplate для отображения иерархического списка, возвращаемого веб-сервисом. В зависимости от критериев поиска этот список может быть очень длинным и иметь несколько вложенных уровней. Было бы полезно показать пользователю своего рода «карту», ​​чтобы он мог видеть, где в этом списке они находятся относительно верхнего уровня. Модель, использованная для создания иерархии, выглядит следующим образом:

public class IndexEntry
{
    public int Score { get; set; }
    //More properties that define attributes of this class

    //Child objects of the hierarchy are stored in this property
    public List<IndexEntry> SubEntries { get; set; }      
}

Как видите, иерархия построена с использованием типов ListEntry.

ViewModel выглядит так:

public class IndexEntriesViewModel
{
    //TreeView ItemsSource is bound to this collection
    public ObservableCollection<IndexEntry> IndexList { get; set; } 
    //More properties to define the ViewModel
}

Как видите, ItemsSource TreeView будет привязан к ObservableCollection типов IndexEntry. Я не вижу очевидного способа доступа к родительскому объекту, как сейчас. Я рассматриваю возможность добавления в модель другого свойства, которое указывало бы непосредственно на родительский объект этой конкретной записи. В конечном итоге это позволило бы мне идти вверх и вниз по иерархии и получать то, что мне нравится, когда мне это нужно.

Итак, вопрос в том, может ли кто-нибудь придумать лучший способ сделать это? Есть ли в самом TreeView свойство, которое мне не хватает, которое предоставит эту возможность?

Ответы [ 2 ]

1 голос
/ 02 сентября 2009

Существует простое решение в выпуске Silverlight Toolkit, выпущенном в июле 2009 года, - метод расширения GetParentItem в TreeViewExtensions.

  1. Загрузите и установите Silverlight Toolkit .

  2. Добавить ссылку на System.Windows.Controls.Toolkit (ее можно найти в C: \ Program Files (x86) \ Microsoft SDKs \ Silverlight \ v3.0 \ Toolkit \ Jul09 \ Bin).

  3. Из метода, который вы хотите получить родителем (я собираюсь использовать событие SelectedItemChanged в качестве примера):

    private void OrgTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        if (e.NewValue != null)
        {
            var parent = ((TreeView)sender).GetParentItem(e.NewValue);
            if (parent != null)
            {
                Status.Text = "Parent is " + parent.ToString();
            }
        };
    }
    

В нем скрыто довольно много замечательных расширений, которые я бы посоветовал вам изучить для настройки выбранного элемента, расширения узлов и получения контейнеров элементов.

0 голосов
/ 24 августа 2009

TreeViewExtensions работает для меня, чтобы найти treeviewitem и родительский объект. Смотрите нижнюю страницу для финала.

http://silverlight.net/forums/t/65277.aspx

...