Wpf 我必须构建一个ControlTemplate吗?还是有其他选择?

Wpf 我必须构建一个ControlTemplate吗?还是有其他选择?,wpf,treeview,controltemplate,Wpf,Treeview,Controltemplate,我得到了一个TreeView,希望显示嵌套的数据(而不是层次结构)。第一级数据称为TaskViewModel,第二级数据称为ArtifactViewModel。我希望ArtifactViewModel水平放置在表示TaskViewModel的GroupBox中。 我尝试了不同的方法,这是我的最后一个: <TreeView Name="tvTasks" ItemsSource="{Binding Tasks}"> <TreeView.Resources>

我得到了一个
TreeView
,希望显示嵌套的数据(而不是层次结构)。第一级数据称为
TaskViewModel
,第二级数据称为
ArtifactViewModel
。我希望
ArtifactViewModel
水平放置在表示
TaskViewModel
GroupBox
中。 我尝试了不同的方法,这是我的最后一个:

<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
中的不同对象。所以如何构建这样的UI?

您在这里遇到的主要问题是嵌套了多个控件,每个控件都有自己的选定项

如果您计划将数据显示为嵌套的,而不是分层的,那么不要麻烦使用TreeView。如果您想在任何给定的时间点选择一个项目,请改用列表框


现在棘手的部分是如何安排项目。看看Bea Stollnitz的例子,她将列表框重绘为画布。您可以执行类似的操作,其中ItemsPanelTemplate是一个画布,您可以计算x,y坐标。或者,您可以使用网格,并确定Grid.Row和Grid.Column值。

谢谢您的回答,但我认为这对我没有帮助。我在这个应用程序中还有一个ContentPresenter,它绑定到TreeView和SelectedItem属性。我以前的一次尝试是ListView(没有TreeView),但效果不太好。祝你好运。但是,我认为只要使用嵌套的选择控件,就会遇到问题。您只需要一个选择控件,并使用DataTemplates进行定位/布局工作。