2012-11-22 37 views
0

我想在WPF中使用HierarchicalDataTemplate和TreeView控件。我創建了一個viewmodel類,但每次程序啓動時都會發生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> 
相關問題