2012-11-22 4 views
0

WPF에서 TreeView 컨트롤로 HierarchicalDataTemplate을 사용하려고합니다. 뷰 모델 클래스를 만들었지 만 프로그램을 시작할 때마다 System.StackOverflowException이 발생합니다. 왜 이런 일이 일어 나는지 나는 모른다. 여기 HierarchicalDataTemplate 바인딩 할 때 StackoverflowException

는 WPF 마크 업입니다 :

<TreeView Grid.Row="2" ItemsSource="{Binding ImportTasks}"> 

     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type VM:SyncToolViewModel}" ItemsSource="{Binding Path=ImportTasks}"> 
       <Label Content="{Binding }"/> 
      </HierarchicalDataTemplate> 
      <HierarchicalDataTemplate DataType="{x:Type VM:VmImportTask}" ItemsSource="{Binding Path=ImportTasks.Tables}"> 
       <Label Content="{Binding }"/> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 

을 여기에 코드의 일부입니다

public class SyncToolViewModel 
{ 
    public DBSyncToolLib.DataContext DataContext { get; set; } 

    private List<VmImportTask> _ImportTasks; 
    public List<VmImportTask> ImportTasks 
    { 
     get 
     { 
      if (_ImportTasks == null) 
      { 
       _ImportTasks = (from IT in DataContext.ImportTask 
           select 
           new VmImportTask() 
           { 
            DBImportTask = IT 
           } 
           ).ToList(); 
      } 
      return _ImportTasks; 
     } 
    } 
} 

public class VmImportTask 
{ 

    public DBSyncToolLib.Schema.ImportTask DBImportTask { get; set; } 

    public List<VmImportTaskTable> Tables 
    { 
     get 
     { 
      var L = (from B in DBImportTask.ImportTaskTable 
        select new VmImportTaskTable() 
        { 
         DBImportTaskTable = B 
        }).ToList(); 
      return L; 
     } 
    } 

    public override string ToString() 
    { 
     return this.DBImportTask.Name; 
    } 
} 

답변

0

나는 잘 모르겠지만, 그래서

<HierarchicalDataTemplate DataType="{x:Type VM:VmImportTask}" ItemsSource="{Binding Path=Tables}"> 

정도

<HierarchicalDataTemplate DataType="{x:Type VM:SyncToolViewModel}" ItemsSource="{Binding Path=ImportTasks.Tables}"> 
0

대신 HierarchicalDataTemplate을 사용하면 스타일을 사용할 수도 있습니다.

약간 예 :

public partial class MainWindow : Window 
{ 
    public List<Parent> Parents { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.Parents = new List<Parent>(); 
     this.Parents.Add(new Parent(){ParentName = "Parent1",Childs = new ObservableCollection<Child>(){new Child(){ChildName = "Child1"},new Child(){ChildName = "Child2"}}}); 
     this.Parents.Add(new Parent() { ParentName = "Parent2", Childs = new ObservableCollection<Child>() { new Child() { ChildName = "Child3" }, new Child() { ChildName = "Child4" } } }); 

     this.DataContext = this.Parents; 
    } 
} 

public class Parent 
{ 
    public string ParentName { get; set; } 
    public ObservableCollection<Child> Childs { get; set; } 
} 

public class Child 
{ 
    public string ChildName { get; set; } 
} 

XAML

<TreeView ItemsSource="{Binding}"> 
     <!-- First Level--> 
     <TreeView.ItemContainerStyle> 
      <Style> 
       <Setter Property="TreeViewItem.Header" Value="{Binding ParentName}"/> 
       <Setter Property="TreeViewItem.ItemsSource" Value="{Binding Childs}"/> 
       <!-- Second Level --> 
       <Setter Property="TreeViewItem.ItemContainerStyle"> 
        <Setter.Value> 
         <Style> 
          <Setter Property="TreeViewItem.Header" Value="{Binding ChildName}"/> 
         </Style> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </TreeView.ItemContainerStyle> 
    </TreeView> 
관련 문제