我有一个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?
答案 0 :(得分:0)
您遇到的主要问题是您正在嵌套多个控件,每个控件都有自己选择的项目。
如果您计划将数据显示为嵌套但不是分层显示,请不要使用TreeView。如果您想在任何给定时间点选择一个项目,请改用ListBox。
现在,棘手的部分是如何摆脱你想要的东西。看看Bea Stollnitz的示例here,在那里她将ListBox重绘为Canvas。您可以在ItemsPanelTemplate是Canvas的情况下执行类似的操作,并计算x,y坐标。或者,您可以使用网格,并确定Grid.Row和Grid.Column值。