在xaml中使用TreeViewItems的ListView

GP8*_*P89 9 c# wpf xaml c#-4.0

我对c#很陌生,我要做的第一件事就是ListView使用数据绑定,结果还不错.

我现在正试图让物品有一个扭曲按钮,如果底层模型有任何孩子(如TreeView).每个孩子的列都与所有顶级项目相同.

我该怎么做呢?这样的控件是否存在?如果不是,我会更好地打扮一个TreeView看起来像一个ListView,或打扮一个ListView看起来像TreeView

我沿着这个解决方案中概述的道路走了一条TreeView,但最终的结果看起来非常糟糕,标题实际上只是一个项目,所以你失去了所有漂亮的列大小和列按钮,可以连接到列排序你进入,ListView这样的路线实际上似乎会更多的工作.

我注意到新任务管理器的控件与我正在尝试创建的完全一样,我不知道这是怎么做的?可能在C中.

ListView与TreeView项目

Evi*_*key 11

Microsoft提供了一个看起来像您正在寻找的样本.可以在此处找到示例的说明:

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

当您构建并运行该示例时,您将得到类似于此的内容:

在此输入图像描述

示例中有大量的模板,因此您可以按照自己的方式进行操作.

  • 看起来该网站上的示例下载链接已关闭. (2认同)
  • 代码的副本似乎可以在 https://github.com/ariesy/WPFSamples/tree/master/TreeListView 以某种形式提供 (2认同)

sa_*_*213 10

它可能会更容易StyleListView,我有一个快速播放和管理10min左右打造一个样机.

在此输入图像描述

显然你会想要添加更多内容,但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>
Run Code Online (Sandbox Code Playgroud)

代码:对于可摘树模型数据加载抱歉:)

   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; }
    }
Run Code Online (Sandbox Code Playgroud)

祝好运 :)


Pau*_*cke 2

您所描述的听起来有点像 TreeListView,如果您搜索“WPF TreeListView”,您会看到一些可能对您有好处的解决方案。我使用了Telerik的一款,但根据您的需求的复杂程度,它可能有点过头了。

如果您只想要一个子级别(如您附加的图像),您可能只想使用 ListView 来滚动自己的子级别,其中第一列具有复杂的 DataTemplate,该列将显示一个扩展器按钮和一个绑定到子项的简单 ListBox。

与此处的答案类似,但您的单元格将有一个样式看起来像箭头的复选框、项目的文本和一个子列表框。然后将子列表框的可见性绑定到复选框的状态。