WPF MVVM 如何使用 Caliburn Micro 创建具有动态/嵌套数据的 Treeview
WPF MVVM How to create Treeview with dynamic / nested data using Caliburn Micro
我有一个简单的模型如下:
public class TreeItem : PropertyChangedBase
{
private string name;
public string Name
{
get => name;
set
{
name = value;
NotifyOfPropertyChange(() => Name);
}
}
public ObservableCollection<TreeItem> Children { get; } = new ObservableCollection<TreeItem>();
}
视图模型:
public ShellViewModel()
{
var data = server.GetData();
BuildTree(data);
}
public ObservableCollection<TreeItem> Root { get; } = new ObservableCollection<TreeItem>();
private void BuildTreeFromObject( AnObjectType data )
{
// it's ok here. I build the tree here
}
是的,它有嵌套集合。
我从服务器获取数据,它也有嵌套列表。我不知道来自服务器的数据有多少级列表。在 ViewModel 中,我可以构建树来分配 属性 根。但我不确定如何在 XAML.
中编写树视图
<TreeView
x:Name="TreeView"
ItemsSource="{Binding Path=Root}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate
DataType="{x:Type models:TreeItem}"
ItemsSource="{Binding Path=Children}">
<TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate
DataType="{x:Type models:TreeItem}"
ItemsSource="{Binding Path=Children}">
<TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate
DataType="{x:Type models:TreeItem}"
ItemsSource="{Binding Path=Children}">
<TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate
DataType="{x:Type models:TreeItem}"
ItemsSource="{Binding Path=Children}">
<TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate DataType="{x:Type models:TreeItem}">
<TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
如您所见,我的树视图只能处理深度级别 4。如果来自服务器的数据超过 4 级别,我需要更改它:(
谁能告诉我如何使用这种嵌套模型创建动态树视图的内容?非常感谢任何帮助。
您不需要所有这些级别。
我认为只有一个分层数据模板应该可以工作。
<HierarchicalDataTemplate
DataType="{x:Type models:TreeItem}"
ItemsSource="{Binding Path=Children}">
<TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name
}">
叶项只是一个没有 children
的 TreeItem
该模板的意思是,只要您获得类型为 treeitem 的 object,就可以使用该模板。给我一个名称为 header 的带标题的项目控件,然后在项目面板中显示 children。
当它获得树项的 children 时,它们变成了树项,因此它再次将其模板化为相同的......等等。
我有一个简单的模型如下:
public class TreeItem : PropertyChangedBase
{
private string name;
public string Name
{
get => name;
set
{
name = value;
NotifyOfPropertyChange(() => Name);
}
}
public ObservableCollection<TreeItem> Children { get; } = new ObservableCollection<TreeItem>();
}
视图模型:
public ShellViewModel()
{
var data = server.GetData();
BuildTree(data);
}
public ObservableCollection<TreeItem> Root { get; } = new ObservableCollection<TreeItem>();
private void BuildTreeFromObject( AnObjectType data )
{
// it's ok here. I build the tree here
}
是的,它有嵌套集合。 我从服务器获取数据,它也有嵌套列表。我不知道来自服务器的数据有多少级列表。在 ViewModel 中,我可以构建树来分配 属性 根。但我不确定如何在 XAML.
中编写树视图<TreeView
x:Name="TreeView"
ItemsSource="{Binding Path=Root}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate
DataType="{x:Type models:TreeItem}"
ItemsSource="{Binding Path=Children}">
<TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate
DataType="{x:Type models:TreeItem}"
ItemsSource="{Binding Path=Children}">
<TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate
DataType="{x:Type models:TreeItem}"
ItemsSource="{Binding Path=Children}">
<TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
<HierarchicalDataTemplate.ItemTemplate>
<HierarchicalDataTemplate
DataType="{x:Type models:TreeItem}"
ItemsSource="{Binding Path=Children}">
<TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate DataType="{x:Type models:TreeItem}">
<TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name}" />
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
如您所见,我的树视图只能处理深度级别 4。如果来自服务器的数据超过 4 级别,我需要更改它:( 谁能告诉我如何使用这种嵌套模型创建动态树视图的内容?非常感谢任何帮助。
您不需要所有这些级别。 我认为只有一个分层数据模板应该可以工作。
<HierarchicalDataTemplate
DataType="{x:Type models:TreeItem}"
ItemsSource="{Binding Path=Children}">
<TextBlock Style="{DynamicResource TextBlockStyle}" Text="{Binding Path=Name
}">
叶项只是一个没有 children
的 TreeItem该模板的意思是,只要您获得类型为 treeitem 的 object,就可以使用该模板。给我一个名称为 header 的带标题的项目控件,然后在项目面板中显示 children。 当它获得树项的 children 时,它们变成了树项,因此它再次将其模板化为相同的......等等。