2017-03-29 15 views
0

私は最初にTreeViewを動作させようとしてきましたが、最初はViewModelがなくても動作しました。しかし、私が何をするにしても、拘束力は正しいものの、子供を示さない。WPF:TreeViewに子が表示されない

私は2つのItemテンプレートを使用しています.1つは階層用、もう1つはデータ用です。あなたは、以下の両方のための重要な部分を見ることができます:

class GrupoTag 
{ 
    public string Nome { get; set; } 
    public GrupoTag Pai { get; set; } 
    public List<Tag> ListaFilhos { get; set; } 
    public List<GrupoTag> SubGrupos { get; set; } 
    public GrupoTag(string nome) 
    { 
     Nome = nome; 
     ListaFilhos = new List<Tag>(); 
     SubGrupos = new List<GrupoTag>(); 
    } 
    public List<object> Filhos 
    { 
     get 
     { 
      List<object> lista = new List<object>(); 
      foreach (GrupoTag subGrupo in SubGrupos) 
       lista.Add(subGrupo); 
      foreach (Tag filho in ListaFilhos) 
       lista.Add(filho); 
     } 
    } 
} 
class Tag 
    { 
     public GrupoTag Pai { get; set; } 
     public string Nome { get; set; } 
     public Tag(string nome) 
     { 
      Nome = nome; 
     } 
     public Tag(GrupoTag pai, string nome) 
     { 
      Pai = pai; 
      Nome = nome; 
     } 
    } 

XAMLは、このすべてに結合する:

<TreeView Name="MenuTags"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="xml2Excel2:GrupoTag" ItemsSource="{Binding Filhos}"> 
      <TextBlock Text="{Binding Nome}" /> 
     </HierarchicalDataTemplate> 
     <DataTemplate DataType="xml2Excel2:Tag"> 
      <TextBlock Text="{Binding Nome}" /> 
     </DataTemplate> 
    </TreeView.Resources> 
</TreeView> 

しかしGrupoTagクラスのプロパティ「FILHOS」がアクセスされることはありません。私はそこに例外を投げてブレークポイントを入れようとしましたが、決して呼び出されませんでした。 TreeViewには、ItemSourceのコードビハインドとして割り当てられたGrupoTagのコレクションの名前しか表示されません。

MenuTags.ItemsSource = arvoreTeste.SubGrupos; 

関連するすべての質問を読み、それぞれのエラーのコードを修正しましたが、私はまだここで失われています。

EDIT 1:だから、私は以下のシンプルなインターフェースに準拠したクラスのコードを変更:ベナンのコメントを1として

class ITag 
{ 
    public string Nome { get; set; } 
    public ObservableCollection<ITag> Filhos { get; set; } 
} 

、GrupoTagは現在、その子を表すためにObservableCollectionに保存された単一のプロパティを使用しています。そして、Adnanの回答によれば、DataTypeがXAML TreeViewから削除されました。これは次のようになります。

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

TreeViewは機能します。しかし、私は理由を知らない。

+1

あなたは 'のObservableCollectionを使用したいと思いますそのアイテムの更新がthに反映されるようにするeビュー。また、単純なプロパティが必要で、プロパティゲッターの外の適切な領域で操作を行います。あなたがここに持っているのは、 'Filhos'プロパティへのアクセスごとに新しいリストを生成することです。それは拘束的な悪夢です。 –

+0

私は 'Filhos'から' SubGrupos'(いくつかのノードはこのタイプの子を持っています)へのバインディングを切り替え、すべてのプロパティのタイプを 'ObservableCollection'に変更しようとしましたが、それでも何もしませんでした。 – manoftheyear

+0

私はどこにバインディングを指しても問題ありません。何も表示されません。一方がObservableCollectionであっても一方のコレクションまたは他のコレクションを直接指している場合は何もしません。 – manoftheyear

答えて

0

TreeView ItemSourceとDataTypeを指定する必要があります。そして、私はBerinsのコメントに同意するでしょう、あなたはFilhosプロパティへのアクセスごとに新しいリストを作成することを避けるべきです。 TreeViewはPolymorphisで非常にうまく動作します。データ型を意味します。

<TreeView DockPanel.Dock="Top" 
      DataContext="{Binding ProjectNodes_DataContext}" 
      ItemsSource="{Binding Nodes}"> 
    <TreeView.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type local:ProjectNode}" ItemsSource="{Binding SubItems}"> 
     <StackPanel> 
      <TextBlock Text="{Binding Header}"/> 
     </StackPanel> 
    </HierarchicalDataTemplate> 
    </TreeView.Resources> 

私の財産は、次のとおりです。

private ProjectNodesVM mProjectNodes_DataContext; 
public ProjectNodesVM ProjectNodes_DataContext 
{ 
    get { return mProjectNodes_DataContext; } 
    protected set 
    { 
     SetProperty(ref mProjectNodes_DataContext, value); 
    } 
} 

とクラスProjectNodesVMがあります。私が持っているProjectNodeクラスの内部

public ObservableCollection<ProjectNode> Nodes { 
    get { return mNodes; } 
    protected set { SetProperty(ref mNodes, value); } 
} 

を:

private string mHeader; 
public string Header 
{ 
    get { return mHeader; } 
    set { SetProperty(ref mHeader, value); } 
} 
+0

'TreeView'に' ItemSource'や 'DataType'を与えるのはどういう意味ですか?私はすでにこれらのプロパティを 'HierarchicalDataTemplate'に与えました。彼らはどこにいるのでしょうか?私は本当に混乱しています、申し訳ありません。 – manoftheyear

+0

@manoftheyearツリーにはルート項目のItemsSourceが必要です。 HierarchicalDataTemplateには、子アイテムの1つが必要です。いずれもデータ型は必要ありません。 –

+0

'DataType'sを削除してインターフェイスを作成しようとしましたが、変更されたXAMLで動作しました。私は理由を知らない。私は質問を編集します。 – manoftheyear

関連する問題