2009-04-05 33 views
5

オブジェクトをTreeViewItemに格納するには、現在オブジェクトをのHeaderに格納してから、そのクラスのToStringメソッドをオーバーライドします正しい文字列ヘッダーを表示するようにします。イベント中にオブジェクトをキャストします。WPF:オブジェクトをTreeViewItemに正しく格納する


これは、このようなことを達成する正しい方法ですか、それともより良い、より適切な方法ですか?

Person.cs

答えて

7

「正しい」方法はただTreeViewからobject年代(またはTreeViewItem年代)Itemsコレクションを追加し、項目がレンダリングされる方法を制御するためにHierarchicalDataTemplateを使用することです:

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> 
+0

ありがとうございました。どのように "ネストされたHierarchicalDataTemplate"を実装するのですか?たとえば、ItemsSourceバインディング内のアイテムには、それらの内部に別のリストがあり、そのリストをそのサブリストにしたいとします。 –

+0

np Dreas。答えとしてマークし、ネストされたHierarchicalDataTemplatesを別の質問をすることができますか? –

+0

こんにちはケント、します。 –

1

私の見解は、実際の質問に答えていない、実際には元の質問は質問の作者はすでに非常に効率的なソリューションを持っていたことを示しているに上記の「答え」問題。ただし、提供される「回答」は、サブオブジェクトをTreeViewItemにアタッチする方法と、その後カスタムメソッドを使用してサブオブジェクトをレンダリングする方法を示しています。これは便利ですが、この答えは元の質問の実際の性質には対処しません。

TreeViewItemには、TreeViewItemのItemsリストに属していない外部オブジェクトが添付されている必要があります。これにより、ユーザーがツリービューからTreeViewItemを選択したときに、アプリケーション固有の目的で添付された外部オブジェクトへのアクセスが容易になります。この概念は、TreeViewItemにサブオブジェクトを追加するという考え方とはまったく異なります。

質問者が最初に実装したソリューションとは対照的に、この問題を解決するもう1つの方法は、TreeViewItemクラスをサブクラス化し、添付オブジェクトなどのカスタム情報を追加することです。この原則は、記事http://msdn.microsoft.com/en-us/library/1330h6a4.aspxに示されています。このカスタムTreeViewItemサブクラスを実装した後、このサブクラスをTreeViewまたはTreeViewItemのItemsリストに追加することができます。ユーザがTreeViewから項目を選択すると、選択項目から返されたオブジェクトはカスタムサブクラスになります。カスタムサブクラスには、サブクラスが定義したカスタム情報が含まれます。

TreeViewItemの代わりにカスタムTreeViewItemサブクラスを使用することの他の利点は、カスタム動作をサブクラスで実装できることです。たとえば、ユーザーがアイテム上にマウスを置いたときにカスタムツールチップを表示するには、サブクラスは次のようなコードでツールヒントオブジェクトを設定します。

関連する問題