Как я могу использовать предопределенные заголовки внутри дерева Silverlight для каждого элемента? - PullRequest
1 голос
/ 16 декабря 2010

Для моего источника предметов 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

и т. Д.Таким образом, ever Order будет иметь Order Items и Commissions header, и их содержимое привязано к даннымЯ немного озадачен этим, хотя это кажется довольно простым.

Это XAML, который у меня есть до сих пор.Очевидно, что создать HierarchicalDataTemplate s для коллекций OrderItems и CommissionsItems просто, но как мне установить ItemsSource HDT выше?Другими словами, как будет выглядеть [что здесь будет?]

    <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 голосов
/ 17 декабря 2010

Для этого вам понадобится конвертер значений, чтобы взять объект 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,Если они оба имеют простые общие свойства, такие как Имя, тогда достаточно одного шаблона для уровня 2.В противном случае все усложняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...