如何以编程方式填充WPF多列TreeView?

时间:2015-11-16 22:49:49

标签: c# wpf xaml data-binding treeview

我是WPF的新手,我花了最后几个小时尝试添加TreeView个项目包含多个列。我在互联网上寻找类似的解决方案,我认为我的问题完全相同,正如在这个答案中所解释的那样:How to bind WPF TreeView to a List programmatically?但是,似乎我无法解决它,所以我想问一下寻求帮助。

以下是XAML中的代码:

<TreeView Name="treeView1">
     <TreeView.ItemTemplate>
          <DataTemplate>
               <Grid>
                   <Grid.ColumnDefinitions>
                       <ColumnDefinition Width="Auto" />
                       <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{Binding carModel}" />
                    <TextBlock Text="{Binding carHorsePower}" />
                </Grid>
          </DataTemplate>
      </TreeView.ItemTemplate>
</TreeView>

这是后面的C#代码:

CarDealer carDealer = GetDealerCars(); 

foreach(var groupedCar in carDealer.cars.GroupBy(x => x.carBrand).ToList())
{
    TreeViewItem item = new TreeViewItem();
    item.Header = groupedCar.Key; // This works fine, it shows the brands in the tree view
    item.ItemsSource = groupedCar; // This is not shown properly, because I am not sure how to bind the carModel and the carHorsePower properties from the list

    treeView1.Items.Add(item);
}

CarDealer类看起来像这样:

public class CarDealer
{
    public string dealerAddress { get; set; }
    public List<Cars> cars { get; set;}
}

public class Cars
{
    public string carBrand { get; set; }
    public string carModel { get; set; }
    public string carHorsePower { get; set; }
}

现在,将显示树状视图,其中包含标题,但我不确定如何添加多个列,而不是列,现在它只显示MyTestWpfApplication.Cars,如上面的链接所示。我想我必须创建文本块并将List<Cars>中的数据绑定到它们。

编辑:我想要实现的是:

enter image description here

2 个答案:

答案 0 :(得分:1)

修改你的xaml:

<Window.Resources>
    <DataTemplate x:Key="subItems">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding carModel}" />
            <TextBlock  Text="{Binding carHorsePower}" Margin="5, 0, 5, 0" Background="Bisque" Grid.Column="1"/>
        </Grid>
    </DataTemplate>
</Window.Resources>
<StackPanel>
    <TreeView Name="treeView1" Loaded="treeView1_Loaded">
    </TreeView>
</StackPanel>

然后修改你的c#代码:

 CarDealer carDealer = GetDealerCars();

 foreach (var groupedCar in carDealer.cars.GroupBy(x => x.carBrand).ToList())
 {
     TreeViewItem item = new TreeViewItem();
     item.Header = groupedCar.Key; 
     var src = new List<Cars>(groupedCar);
     item.ItemTemplate = (DataTemplate)FindResource("subItems");
     item.ItemsSource = src;

      treeView1.Items.Add(item);
 }

但话又说回来,如果你花更多的时间在MVVM中转换项目,使用模板等等。这样会更好。

答案 1 :(得分:1)

我无法找到怎么做,因为我没有更多的时间,所以我决定选择ListViewGridView,这实际上更容易实现

对于其他想要做同样事情的人来说,这是一个很好的教程:http://www.wpf-tutorial.com/listview-control/listview-grouping/