2009-05-26 4 views
1

Я получил TreeView и хочу отображать данные вложенными (не иерархически). Данные первого уровня называются TaskViewModel, данные второго уровня - ArtifactViewModel. Я хочу, чтобы ArtifactViewModel горизонтально внутри GroupBox, который представляет TaskViewModel. Я пробовал различные подходы, это мой последний:Должен ли я создать контрольную таблицу? Или есть альтернатива?

<TreeView Name="tvTasks" ItemsSource="{Binding Tasks}"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type vm:TaskViewModel}"> 
      <GroupBox Header="{Binding Name, UpdateSourceTrigger=PropertyChanged}"> 
       <StackPanel Orientation="Vertical"> 
        <ListView ItemsSource="{Binding Children}"/> 
        <TextBlock Text="{Binding Description, UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap"/> 
       </StackPanel> 
      </GroupBox> 
     </HierarchicalDataTemplate> 
     <DataTemplate DataType="{x:Type vm:ArtifactViewModel}"> 
      <Border Background="{Binding Type,Converter={StaticResource Type2Background}}" 
        Margin="5" BorderBrush="Black" BorderThickness="2" CornerRadius="2"> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="80"/> 
         <RowDefinition Height="20"/> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="100"/> 
        </Grid.ColumnDefinitions> 
        <TextBlock Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" 
           TextAlignment="Center" Background="Black" Foreground="White" 
           Opacity="0.75" Grid.Column="0" Grid.Row="1"/> 
       </Grid> 
      </Border> 
     </DataTemplate>           
    </TreeView.Resources> 
</TreeView> 

Это выглядит очень похоже на то, что я хочу, кроме того, что ArtifactViewModel s показаны вертикальные. И если я нажму на ArtifactViewModel, tvTasks.SelectedItem не изменится, потому что ListView передает это событие. Я знаю, что этот подход не самый умный, но это просто попытка.
Я посмотрел на this article, но я не вижу, как иметь дело с разными объектами, которые я хочу поместить в TreeView. Итак ... как я могу создать такой интерфейс?

ответ

0

Основная проблема, с которой вы столкнулись, заключается в том, что вы вставляете несколько элементов управления, каждый из которых имеет свои собственные элементы.

Если вы планируете показывать данные как вложенные, но не иерархически, не пытайтесь использовать TreeView. Если вы хотите, чтобы один элемент можно было выбрать в любой момент времени, используйте ListBox.

Теперь сложная часть играет с тем, как вы хотите выложить предметы. Взгляните на пример Bea Stollnitz here, где она перерисовывает ListBox как холст. Вы можете сделать что-то подобное, если ItemsPanelTemplate - это холст, и вы вычисляете координаты x, y. В качестве альтернативы вы можете использовать Grid и определить значения Grid.Row и Grid.Column.

+0

Спасибо за ваш ответ, но я не думаю, что это помогло бы мне. У меня также есть приложение ContentPresenterin, которое привязано к TreeView и свойству SelectedItem. Одна из моих предыдущих попыток была ListViews (без TreeView), которая не работала очень хорошо. –

+1

Удачи. Тем не менее, я думаю, что у вас возникнут проблемы, пока используются вложенные элементы управления выбором. Вам понадобится только один элемент управления выбором и использовать DataTemplates для выполнения позиционирования/компоновки. – micahtan

Смежные вопросы