0

我有一堂课:

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

像这样的xml:

<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 或其他地方。谢谢。

4

1 回答 1

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 ItemsSource="{Binding Path=Orders,Converter={StaticResource testConverter}}" />

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

于 2012-07-26T23:23:38.220 回答