对于我的Silverlight TreeView
项目来源,我有一组Order
项,每个Order
有两个集合,OrderItems
和Commissions
。所以我想要一个看起来像
Order #1
- Order Items
- Order Item #1
- Order Item #2
- Order Item #3
- Commissions
- Commission #1
- Commission #2
- Commission #3
- Commission #4
等。因此,永远订单将包含订单商品和佣金标头,其内容将为数据绑定。虽然这看起来很简单,但我对此感到很难过。
这是我到目前为止的XAML。显然,为HierarchicalDataTemplate
和OrderItems
集合创建CommissionsItems
s很简单,但如何设置上面的HDT的ItemsSource
?换句话说,[什么会在这里?]看起来像什么?
<Grid>
<Grid.Resources>
<sdk:HierarchicalDataTemplate
x:Key="OrdersTreeLevel0"
ItemsSource="{StaticResource [what goes here?]}"
ItemTemplate={StaticResource OrdersTreeLevel1}">
<TextBlock
FontWeight="{Binding IsUnread}"
Text="{Binding Id, StringFormat='Order #{0}'}" />
</sdk:HierarchicalDataTemplate>
</Grid.Resources>
<sdk:TreeView
ItemsSource="{Binding Items}"
ItemTemplate="{StaticResource OrdersTreeLevel0}">
</sdk:TreeView>
</Grid>
答案 0 :(得分:0)
您需要使用值转换器来获取Order
对象并将其转换为带有Name
和Items
属性的类型的数组: -
public class ItemWrapper
{
public string Name {get; set; }
public IEnumerable Items {get; set;}
}
public class OrderConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Order order = value as Order;
if (order != null)
{
List<object> result = new List<object>();
result.Add(new ItemWrapper() {Name = "Order Items", Items = order.OrderItems} );
result.Add(new ItemWrapper() {Name = "Commission Items", Items = order.CommissionItems} );
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
现在您将此转换器添加到您的资源并在模板中引用它: -
<Grid.Resources>
<local:OrderConverter x:Key="OrderConverter" />
<sdk:HierarchicalDataTemplate
x:Key="OrdersTreeLevel0"
ItemsSource="{Binding Converter=OrderConverter}"
ItemTemplate={StaticResource OrdersTreeLevel1}">
<TextBlock
FontWeight="{Binding IsUnread}"
Text="{Binding Id, StringFormat='Order #{0}'}" />
</sdk:HierarchicalDataTemplate>
</Grid.Resources>
当然,如果您需要Commission
和OrderItem
的其他模板,那么简单就是一个非常棘手的问题。如果它们都具有共同的简单属性,例如Name,那么level2的单个模板就足够了。否则事情变得更复杂。