单个类中的TreeView和HieracrhicalDataTemplate

时间:2012-07-26 19:50:05

标签: wpf treeview

我上课了:

class WorkOrder
{
    public string Building {get; set;}
    public string Area {get; set;}
    public string Name {get; set;}
    List<Item> Items {get; set;}
}

我目前正在这样排序:

-Name
    -Item
    -Item
-Name
    -Item
    -Item

像这样的xaml:

<HierarchicalDataTemplate DataType="{x:Type WorkOrder}" ItemsSource="{Binding Items}" >
    <TextBlock Text="{Binding Path=Name} Margin="5,0" />
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type Item}">
    <TextBlock Text="{Binding Path=Name}" />
</DataTemplate>

我想在TreeView中对此进行排序,如:

Building
    -Area
        -Name
        -Name
    -Area
        -Name
        -Name

不确定我是否应该关注MultiBinding或其他地方。感谢。

1 个答案:

答案 0 :(得分:1)

我想不出用绑定或XAML做任何方法。我假设您不想更改WorkOrder或Item类(因为如果您希望/允许更改它们,您可以在对象层次结构中的另一层中创建),我就玩了。

作为UI方面的解决方法,您可以执行以下操作:

1)添加一个包含建筑物分组信息的类

public class BuildingGroup
{
    public string Name { get; set; }
    public IEnumerable<WorkOrder> Orders { get; set; }
}

2)创建一个转换器,将您当前的工作订单集转换为建筑群的集合

public class GroupingConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var workOrders = (IEnumerable<WorkOrder>)value;

        return GroupTheseBadBoysByBuilding(workOrders);
    }

    private IEnumerable GroupTheseBadBoysByBuilding(IEnumerable<WorkOrder> workOrders)
    {
        var buildingGroups = workOrders.GroupBy(w => w.Building);

        foreach (var buildingGroup in buildingGroups)
        {
            yield return new BuildingGroup
            {
                Name = buildingGroup.Key,
                Orders = buildingGroup,
            };
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

3)为建筑群

设置数据模板
    <HierarchicalDataTemplate DataType="{x:Type local:BuildingGroup}" ItemsSource="{Binding Orders}" >
        <TextBlock Text="{Binding Path=Name}" Margin="5,0" />
    </HierarchicalDataTemplate>

4)创建转换器的实例并在treeview上使用它

<TreeView ItemsSource="{Binding Path=Orders,Converter={StaticResource testConverter}}" />

我认为这种方法唯一的主要警告是你将失去任何INotifyCollectionChanged处理(不知道你是否使用它!)