2012-01-25 9 views
0

私はアイテムの階層リストを表示するWPFツリービューコントロール(C#では、それは重要ではありません)を作成しようとしています。それに加えて、ツリー内の各アイテムには、のタイプ「」の「その他のアイテム」のリストが表示されます(下記参照)。2つの異なるタイプの2つのリストを含むデータバインドされたアイテムでWPFツリービューをセットアップするにはどうすればよいですか?

+ Item1 
    - OtherItem1 
    - OtherItem2 
    + Item2 
     - OtherItem3 
     - OtherItem4 
     + Item3 
    + Item4 

    etc... 

私はすべてのデータバインドとドラッグアンドドロップをサポートしたいと思います。私は基本的なリストは "アイテム"の設定だけが含まれているが、私は少し問題が第2のリストをサポートする方法を考えている。誰かがItemSourceのタイプの方向に私を指し示すことさえできるのであれば、それはたくさんの助けになるはずです。

マルチバインドなどが必要ですか?ここで私は現時点で何をしようとしているのですか(しかしそれはうまくいかない)。 は単にアイテムの名前を表す文字列とコンポーネントある

<TreeView ItemsSource="{Binding Bones}"> 
    <TreeView.ItemContainerStyle> 
     <!-- 
     This Style binds a TreeViewItem to a BoneTreeViewModel. 
     --> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
      <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
      <Setter Property="FontWeight" Value="Normal" /> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="FontWeight" Value="Bold" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </TreeView.ItemContainerStyle> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate DataType="{x:Type src:Skeleton.BoneTreeViewModel}"> 
      <HierarchicalDataTemplate.ItemsSource> 
       <MultiBinding> 
        <Binding Path="Name" /> 
        <Binding Path="Components" /> 
       </MultiBinding> 
      </HierarchicalDataTemplate.ItemsSource> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

はOtherItemの(平坦、非階層)ReadOnlyCollectionあります。

読んでいただきありがとうございます!

答えて

1

ここで私はツリービューあなたはVMの

drag and drop answer

public class TreeNodeViewModel 
{ 
    public TreeNodeViewModel() 
    { 
     Children = new ObservableCollection<TreeNodeViewModel>(); 
    } 

    public bool IsExpanded { get; set; } 
    public bool IsSelected { get; set; } 
    public string Description { get; set; } 


    public ObservableCollection<TreeNodeViewModel> Children { get; set; } 
} 

とリンクのあなたの2種類の基本クラスとして使用することができます

<TreeView ItemsSource="{Binding Items}" > 
     <i:Interaction.Behaviors> 
      <Behaviors:TreeViewSelectedItemBehavior SelectedItem="{Binding SelectedItem,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" /> 
     </i:Interaction.Behaviors> 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="{x:Type TreeViewItem}"> 
       <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
       <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
       <Setter Property="FontWeight" Value="Normal" /> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="FontWeight" Value="Bold" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </TreeView.ItemContainerStyle> 

     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
       <TextBlock Text="{Binding Description}" /> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

と単純化されたVMに使用するXAMLです

+0

こんにちはアントン、私を助けるために時間を割いてくれてありがとう。私はこのオプションを検討しましたが、実際に問題を解決するわけではありません。私は、 "otheritem"型が階層的で子どもを持つことを望まない。解決策は、アイテムと他のアイテムの両方がツリービューで同じ方法で扱われることを意味します。 – JBeFat

+0

私は上記のベースを使用して、ツリービュー内の複数のタイプのアイテムを表します。また、私はこれらのノードをツリービューで使用するための "コンテナ"と見なします。私のVMとツリービューをいくつかの複雑な方法で一緒に動作させようとするのではなく、階層 – Anton

関連する問題