我上课了:
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或其他地方。感谢。
答案 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处理(不知道你是否使用它!)