在xaml中使用TreeViewItems的ListView

时间:2013-01-21 17:42:01

标签: c# wpf xaml c#-4.0

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

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

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

我沿着这条solution中描绘的道路走了一条TreeView,但最终结果看起来非常糟糕,标题实际上只是一个项目,所以你失去了所有漂亮的列大小和列按钮可以连接到ListView中的列排序,这样路线实际上看起来就更有用了。

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

ListView with TreeView items

3 个答案:

答案 0 :(得分:11)

Microsoft提供了一个看似您正在寻找的示例。可以在此处找到示例的说明:

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

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

enter image description here

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

答案 1 :(得分:9)

Style ListView TreeView可能会更容易,我有一个快速的游戏,并设法在大约10分钟内创建一个模型。

enter image description here

显然,您需要添加更多内容,但在ListView列中托管<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> 似乎相当容易。

如果你想使用构建代码,这是模型代码。

的Xaml:

   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; }
    }

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

{{1}}
祝你好运:)

答案 2 :(得分:3)

你所描述的听起来有点像TreeListView,如果你谷歌'WPF TreeListView',你会看到一些可能对你有用的解决方案。我使用了Telerik中的一个,但根据您的需求有多复杂,它可能有点过分。

如果您只想要一个子级别,例如您附加的图像,您可能想要使用带有复杂DataTemplate的ListView为第一列滚动自己,这将显示扩展器按钮和绑定到子项的简单ListBox项目

answer here类似,但您的单元格的复选框样式与箭头,项目文本和子ListBox类似。然后将子ListBox的可见性绑定到复选框的状态。