WPF复杂分层数据模板
本文关键字:数据 分层 复杂 WPF | 更新日期: 2023-09-27 17:53:12
我正在看一个复杂的结构,我似乎找不到一种方法来显示它…
我的情况:
Class: Milestone内部有2个列表,其他子里程碑列表和活动列表。
结构可以是这样的
M1- 里程碑
- SubMilestone
- <
- 里程碑/gh><
- 活动/gh>
- Submilestone
< - SubMilestone
- 活动/gh>
有人知道如何创建这个吗?或者能给我指引方向?
回答我的问题
<TreeView ItemsSource="{Binding Path=Project.TrackList}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type deto:Track}" ItemsSource="{Binding Path=FaseList}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=TrackType}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type deto:Fase}" ItemsSource="{Binding Path=MilestoneList}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=FaseType}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type deto:Milestone}" ItemsSource="{Binding Converter={StaticResource MConverter}}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Description}" />
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type deto:Activity}" ItemsSource="{Binding Path=ActivityList}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Description}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
和转换器:
public class MilestoneConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var m = value as Milestone;
CompositeCollection collection = new CompositeCollection();
collection.Add(new CollectionContainer()
{
Collection = m.MilestoneList
});
collection.Add(new CollectionContainer()
{
Collection = m.ActivityList
});
return collection;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
您应该能够使用CompositeCollection
来执行此操作。在Xaml中这样做在引用源代码方面可能有点复杂,但是在这种情况下使用转换器应该是可以接受的:
public class MilestoneItemsSourceCreator : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
var input = value as Milestone;
CompositeCollection collection = new CompositeCollection();
collection.Add(new CollectionContainer(){ Collection = input.SubMilestones });
collection.Add(new CollectionContainer(){ Collection = input.Activities });
return collection;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
<vc:MilestoneItemsSourceCreator x:Key="MilestoneItemsSourceCreator"/>
<HierarchicalDataTemplate DataType="{x:Type local:Milestone}"
ItemsSource="{Binding Converter={StaticResource MilestoneItemsSourceCreator}}">
<!-- DataTemplate -->
</HierarchicalDataTemplate>
这可能不完全适合你的类结构,但你没有明确地发布这些,一些调整可能需要
我以前也做过类似的事情。
你应该显示两个列表控件(例如ListView/ListBox),一个在另一个之上,并将第二个的Data绑定到第一个的选中项。
在你的情况下,你似乎需要3个列表控件,适应你喜欢。