我是否必须构建ControlTemplate?还是有替代方案吗?

时间:2009-05-26 21:51:57

标签: wpf treeview controltemplate

我有一个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 handels这个事件。我知道这种做法并不是最聪明的,但这只是一次尝试 我看了this article,但我看不到如何处理我想放在TreeView中的不同对象。那么......我如何构建这样的UI?

1 个答案:

答案 0 :(得分:0)

您遇到的主要问题是您正在嵌套多个控件,每个控件都有自己选择的项目。

如果您计划将数据显示为嵌套但不是分层显示,请不要使用TreeView。如果您想在任何给定时间点选择一个项目,请改用ListBox。

现在,棘手的部分是如何摆脱你想要的东西。看看Bea Stollnitz的示例here,在那里她将ListBox重绘为Canvas。您可以在ItemsPanelTemplate是Canvas的情况下执行类似的操作,并计算x,y坐标。或者,您可以使用网格,并确定Grid.Row和Grid.Column值。