我想不出任何仅使用绑定或 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 处理(不知道您是否正在使用它!)