2013-01-21 78 views
8

TreeViewItems我很新的C#,我想要做的第一件事是ListView與已經變成了確定的數據綁定。ListView控件與XAML

我現在努力使項目有一個扭曲按鈕,如果基礎模型有任何兒童(如TreeView)。每個孩子將有與所有頂級項目相同的列。

我怎麼會去這樣做呢?是否有像這樣的現有控件?如果不是,我會更好打扮TreeView看起來像ListView,或打扮ListView看起來像TreeView

我去了在這個solution它打扮一TreeView列出的道路,但最終的結果看起來很糟糕,標題實際上只是一個項目,讓你失去一切好列寬和列的按鈕,可以連接列排序,你在ListView得到,以便路線實際上似乎是更多的工作。

我注意到新的任務管理器有一個控制酷似什麼,我試圖創造,我不知道該怎麼做這個?可能在C雖然。

ListView with TreeView items

回答

3

你描述聽起來有點像TreeListView,如果你谷歌「WPF TreeListView」你會看到一些解決方案,這可能是對你有好處。我已經使用Telerik中的一個,但是這可能是矯枉過正的,這取決於您的需求有多複雜。

如果您只想要附加的圖像這樣的一個子級別,您可能需要使用帶有複雜DataTemplate的ListView來滾動您自己的第一列,這將顯示一個擴展器按鈕和一個簡單的ListBox綁定到兒童項目。

answer here類似,除了您的單元格將具有複選框樣式,使其看起來像箭頭,項目的文本和子項列表框。然後將子列表框的可見性綁定到複選框的狀態。

10

Microsoft提供了一個看似您正在尋找的示例。示例的記錄可以在這裏找到:

http://msdn.microsoft.com/en-us/library/vstudio/ms771523(v=vs.90).aspx

當你構建和運行的例子,你會最終的東西類似這樣的:

enter image description here

有一個大在這個例子中模板的數量,所以你將能夠讓事情看起來像你想要的。

+0

+1家庭蓋伊參考:) – bouvierr

+0

我沒」你知道,總是邪惡的。 –

8

它可能會更容易StyleListView,我有一個快速發揮,並設法創建一個模型約10分鐘。

enter image description here

很明顯,你會希望添加更多,但它似乎很容易主辦TreeViewListView柱內。

這裏是樣機代碼,如果你想使用的基礎上。

的XAML:

<Window x:Class="WpfApplication8.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="233" Width="405" Name="UI"> 
    <Grid DataContext="{Binding ElementName=UI}"> 
     <ListView ItemsSource="{Binding Processes}" > 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="Process" Width="200" > 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <StackPanel> 
            <TreeView BorderThickness="0" ItemsSource="{Binding Processes}" > 
             <TreeView.ItemTemplate> 
              <HierarchicalDataTemplate ItemsSource="{Binding Processes}"> 
               <TextBlock Text="{Binding Name}" /> 
              </HierarchicalDataTemplate> 
             </TreeView.ItemTemplate> 
            </TreeView> 
           </StackPanel> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn Header="CPU" > 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding CpuUsage, StringFormat={}{0} %}" TextAlignment="Right" /> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn Header="Memory" > 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding MemUsage, StringFormat={}{0} MB}" TextAlignment="Right" /> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 
      <ListView.ItemContainerStyle> 
       <Style TargetType="ListViewItem"> 
        <Setter Property="VerticalContentAlignment" Value="Top" /> 
       </Style> 
      </ListView.ItemContainerStyle> 
     </ListView> 
    </Grid> 
</Window> 

代碼:關於treeible模型數據加載:)對不起

public partial class MainWindow : Window 
    { 
     private ObservableCollection<ProcessInfo> _processes = new ObservableCollection<ProcessInfo>(); 

     public MainWindow() 
     { 
      InitializeComponent(); 
      Processes.Add(new ProcessInfo 
      { 
       CpuUsage = 10.3, 
       MemUsage = 48.9, 
       Processes = new ObservableCollection<Process>() 
      }); 
      var pro = new Process{ Name = "Process1", Processes = new ObservableCollection<Process>()}; 
      pro.Processes.Add(new Process { Name = "SubProcess1", Processes = new ObservableCollection<Process>() }); 
      Processes[0].Processes.Add(pro); 
      Processes.Add(new ProcessInfo 
      { 
       CpuUsage = 0, 
       MemUsage = 100, 
       Processes = new ObservableCollection<Process>() 
      }); 
      var pro2 = new Process { Name = "Process2", Processes = new ObservableCollection<Process>() }; 
      pro2.Processes.Add(new Process { Name = "SubProcess1", Processes = new ObservableCollection<Process>() }); 
      pro2.Processes.Add(new Process { Name = "SubProcess2", Processes = new ObservableCollection<Process>() }); 
      pro2.Processes.Add(new Process { Name = "SubProcess3", Processes = new ObservableCollection<Process>() }); 
      Processes[1].Processes.Add(pro2); 
     } 

     public ObservableCollection<ProcessInfo> Processes 
     { 
      get { return _processes; } 
      set { _processes = value; } 
     } 
    } 

    public class ProcessInfo 
    { 
     public ObservableCollection<Process> Processes { get; set; } 
     public double CpuUsage { get; set; } 
     public double MemUsage { get; set; } 
    } 

    public class Process 
    { 
     public string Name { get; set; } 
     public ObservableCollection<Process> Processes { get; set; } 
    } 

祝你好運:)