WPF: правильное хранение объекта в TreeViewItem - PullRequest
5 голосов
/ 05 апреля 2009

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


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

Ответы [ 2 ]

7 голосов
/ 05 апреля 2009

«Правильный» способ - просто добавить object в коллекцию TreeView (или TreeViewItem) Items и использовать HierarchicalDataTemplate для управления отображением элемента: 1006 *

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>
1 голос
/ 19 сентября 2011

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

Существует много сценариев, в которых TreeViewItem должен иметь прикрепленный внешний объект, который не принадлежит списку Items 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...