如何在Silverlight树视图中为每个项目使用预定义标头?

时间:2010-12-16 20:51:55

标签: silverlight xaml treeview

对于我的Silverlight TreeView项目来源,我有一组Order项,每个Order有两个集合,OrderItemsCommissions。所以我想要一个看起来像

的树视图
Order #1
    - Order Items
        - Order Item #1
        - Order Item #2
        - Order Item #3
    - Commissions
        - Commission #1
        - Commission #2
        - Commission #3
        - Commission #4

等。因此,永远订单将包含订单商品佣金标头,其内容将为数据绑定。虽然这看起来很简单,但我对此感到很难过。

这是我到目前为止的XAML。显然,为HierarchicalDataTemplateOrderItems集合创建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>

1 个答案:

答案 0 :(得分:0)

您需要使用值转换器来获取Order对象并将其转换为带有NameItems属性的类型的数组: -

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>  

当然,如果您需要CommissionOrderItem的其他模板,那么简单就是一个非常棘手的问题。如果它们都具有共同的简单属性,例如Name,那么level2的单个模板就足够了。否则事情变得更复杂。