WPF: правильное хранение объекта в TreeViewItem

Чтобы сохранить объект (скажем, экземпляр класса) в TreeViewItem, я в настоящее время храню объект в TreeViewItem"s Header а затем переопределить ToString метод этого класса, чтобы он отображал правильный заголовок строки; Затем я отбрасываю объект обратно во время события.


Это правильный путь для достижения такого рода вещи, или есть ли лучший, более правильный путь?

2 ответа

Решение

"Правильный" способ - просто добавить object к TreeViewх (или TreeViewItem"S) Items сбор и использование HierarchicalDataTemplate чтобы контролировать способ визуализации элемента:

Person.cs:

public class Person
{
    private readonly ICollection<Person> _children = new ObservableCollection<Person>();

    public string Name { get; set; }

    public ICollection<Person> Children
    {
        get
        {
            return _children;
        }
    }
}

Window1.xaml.cs:

public Window1()
{
    InitializeComponent();

    var people = new List<Person>();
    var kent = new Person() { Name = "Kent" };
    kent.Children.Add(new Person() { Name = "Tempany" });
    people.Add(kent);
    _treeView.ItemsSource = people;
}

Window1.xaml:

<TreeView x:Name="_treeView">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type local:Person}" ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

Приведенный выше "ответ", на мой взгляд, не отвечает на реальный вопрос, и фактически исходный вопрос указывает на то, что автор вопроса уже нашел очень эффективное решение проблемы. Однако предоставленный "ответ" просто показывает, как прикрепить подобъект к TreeViewItem и как впоследствии отобразить его, используя пользовательский метод. Хотя это полезно, этот ответ не затрагивает фактическую природу исходного вопроса.

Существует много сценариев, в которых TreeViewItem должен иметь прикрепленный внешний объект, который не входит в список элементов TreeViewItem. Это облегчает доступ к присоединенному внешнему объекту для конкретных приложений, когда пользователь выбирает TreeViewItem из TreeView. Эта концепция полностью отличается от идеи добавления подобъектов в TreeViewItem.

Альтернативный метод решения этой проблемы, в отличие от решения, первоначально реализованного автором вопроса, заключается в создании подкласса класса TreeViewItem и добавлении пользовательской информации, такой как прикрепленный объект. Этот принцип иллюстрируется в статье http://msdn.microsoft.com/en-us/library/1330h6a4.aspx. После реализации этого пользовательского подкласса TreeViewItem этот подкласс может быть добавлен в список элементов либо TreeView, либо TreeViewItem. Когда пользователь выбирает элемент из TreeView, объект, возвращаемый из выбора, будет пользовательским подклассом, который будет содержать любую пользовательскую информацию, определенную подклассом.

Дополнительным преимуществом использования пользовательского подкласса TreeViewItem вместо TreeViewItem является то, что подклассом может быть реализовано пользовательское поведение. Например, чтобы отобразить пользовательскую подсказку, когда пользователь наводит курсор мыши на элемент, подкласс может установить для себя объект ToolTip с кодом, подобным следующему:

ToolTip tip = new ToolTip() { Content = "Tooltip display value" };
ToolTipService.SetToolTip(this, tip);
Другие вопросы по тегам