Должен ли я создать ControlTemplate? Или есть альтернатива? - PullRequest
1 голос
/ 27 мая 2009

Я получил 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 управляет этим событием. Я знаю, что этот подход не самый умный, но это всего лишь попытка.
Я посмотрел на эту статью , но я не понимаю, как обращаться с различными объектами, которые я хочу поместить в TreeView. Итак ... как мне создать такой интерфейс?

1 Ответ

0 голосов
/ 29 мая 2009

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

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

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

...