2014-09-30 253 views
0

我想將自定義對象的集合綁定到WPF中的樹視圖的ItemSource,但沒有成功。自定義WPF TreeView綁定

這裏是MainWindow.xaml:

<Window 
    x:Class="AoiImageLift.Views.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:AoiImageLift.UI.ViewModels" 
    Height="500" 
    Width="500"> 
    <Window.DataContext> 
     <vm:MainWindowViewModel/> 
    </Window.DataContext> 
    <TreeView ItemsSource="{Binding TreeViewViewModel.ProcessList}"/> 
</Window> 

這裏是App.xaml中:

</Application> 
    </Application.Resources> 

     <!-- TreeView Style --> 
     <Style TargetType="{x:Type TreeView}"> 
      <Setter Property="ScrollViewer.CanContentScroll" Value="True"/> 
      <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible"/> 
      <Setter Property="SelectedValuePath" Value="Wafer"/> 
      <Setter Property="ItemTemplate"> 
       <Setter.Value> 
        <HierarchicalDataTemplate ItemsSource="{Binding ProcessList}"> 
         <HierarchicalDataTemplate.ItemTemplate> 
          <HierarchicalDataTemplate> 
           <TextBlock 
            FontFamily="SegoeUI" 
            Foreground="MidnightBlue" 
            Text="{Binding Wafer}"/> 
          </HierarchicalDataTemplate> 
         </HierarchicalDataTemplate.ItemTemplate> 
         <TextBlock 
          Text="{Binding ProcessNumber}" 
          FontFamily="SegoeUI" 
          Foreground="MidnightBlue"/> 
        </HierarchicalDataTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Application.Resources> 
</Application> 

這裏是MainWindowViewModel.cs:

public class MainWindowViewModel : ViewModel 
{ 
    private WaferSelectionTreeViewViewModel treeViewViewModel; 

    public MainWindowViewModel() 
    { 
     BackgroundWorker initThread = new BackgroundWorker(); 
     initThread.DoWork += (sender, e) => 
     { 
      e.Result = new SingulationOneTable().GetWaferList(); 
     }; 
     initThread.RunWorkerCompleted += (sender, e) => 
     { 
      TreeViewViewModel = new WaferSelectionTreeViewViewModel(
       (List<string>) e.Result); 
     }; 
     initThread.RunWorkerAsync(); 
    } 

    public WaferSelectionTreeViewViewModel TreeViewViewModel 
    { 
     get { return treeViewViewModel; } 
     set 
     { 
      treeViewViewModel = value; 
      OnPropertyChanged("TreeViewViewModel"); 
     } 
    } 
} 

FYI,這條線的代碼...

e.Result = new SingulationOneTable().GetWaferList(); 

...只是返回一大串字符串。然後將該字符串列表傳遞給WaferSelectionTreeViewViewModel類的構造函數。

這裏是WaferSelectionTreeViewViewModel.cs:

public class WaferSelectionTreeViewViewModel : ViewModel 
{ 
    private ObservableCollection<Process> processList; 

    public class TreeViewItemBase : ViewModel 
    { 
     private bool isSelected; 
     public bool IsSelected 
     { 
      get { return isSelected; } 
      set 
      { 
       if (value != isSelected) 
       { 
        isSelected = value; 
        OnPropertyChanged("IsSelected"); 
       } 
      } 
     } 
     private bool isExpanded; 
     public bool IsExpanded 
     { 
      get { return isExpanded; } 
      set 
      { 
       if (value != isExpanded) 
       { 
        isExpanded = value; 
        OnPropertyChanged("IsExpanded"); 
       } 
      } 
     } 
    } 
    public class Process : TreeViewItemBase 
    { 
     private string name; 
     public Process(string name) 
     { 
      this.name = name; 
      this.Children = new ObservableCollection<string>(); 
     } 

     public string Name { get { return name; } } 
     public ObservableCollection<string> Children { get; set; } 
    } 

    public WaferSelectionTreeViewViewModel(List<string> waferList) 
    { 
     processList = new ObservableCollection<Process>(); 
     List<string> procList = new List<string>(); 
     foreach (string wafer in waferList) 
     { 
      procList.Add(wafer.Substring(0, 4)); 
     } 

     IEnumerable<string> distintProcessList = procList.Distinct(); 
     foreach (string process in distintProcessList) 
     { 
      Process newProcess = new Process(process); 
      List<string> wafersInProcess = waferList.FindAll(
       x => x.Substring(0, 4) == process); 
      foreach (string waferInThisProcess in wafersInProcess) 
      { 
       newProcess.Children.Add(waferInThisProcess); 
      }     
     } 
    } 

    public ObservableCollection<Process> ProcessList 
    { 
     get 
     { 
      return processList; 
     } 
     set 
     { 
      processList = value; 
      OnPropertyChanged("ProcessList"); 
     } 
    } 
} 

誰能弄清楚爲什麼項目沒有顯示在樹視圖中了?

問候,

凱爾

回答

0

,我們在您綁定了幾個錯誤。如果您從Visual Studio中運行你的應用程序,你可能會看到這樣的一個或多個消息在Output窗口:

System.Windows.Data Error: 40 : BindingExpression path error: (...) 

首先,每一根項目從TreeViewViewModel.ProcessList綁定到Process對象,它告訴顯示一個名爲ProcessNumber的房產,但沒有這樣的房產,至少在您發佈的代碼中沒有。所以我猜測處理項目顯示在TreeView中,但它們是空白的。

其次,您的HierarchicalItemTemplate表示可以在名爲ProcessList的屬性中找到子項目列表。但是每個根項目都是Process,它沒有該屬性,因此不顯示子項目。你大概的意思:現在

<HierarchicalDataTemplate ItemsSource="{Binding Children}"> 

Process.Childrenstring個簡單的列表,這樣你就不會需要包括<HierarchicalDataTemplate.ItemTemplate>部分(當然,字符串沒有Wafer屬性,模板尋找對於)。