私のツリービューには、ItemsSourceを提供する2つの異なるクラスがあります。
public class TreeViewModel : ViewModelBase
{
public ObservableCollection<NodeViewModel> Items { get; set; }
}
public class NodeViewModel : ViewModelBase
{
public string Id { get; set; }
public string Name { get; set; }
public ObservableCollection<NodeViewModel> Children { get; set; }
}
TreeViewにTreeViewModelの項目を表示し、NodeViewModelによって提供される階層データを表示する必要があります。
これが私のXAMLです
<Window x:Class="TreeViewMasterDetails.MainWindow"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TreeViewMasterDetails"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TreeView Height="Auto"
HorizontalAlignment="Stretch"
Margin="10"
VerticalAlignment="Stretch"
Width="Auto">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="x:Type local:TreeViewModel" ItemsSource="{Binding Items}">
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="x:Type local:NodeViewModel" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}"></TextBlock>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>
</Window>
Items
のItemsSource
としてTreeView
を提供しようとしました。何かを表示する場合、データを階層的に表示しません。
また、TreeView.Resources
の代わりにItemTemplate
を使用してみました。
それの何が問題になっていますか?
おそらく、最初のTextBlock Text Binding
に問題がありますか?そこにName
のNodeViewModel
のItems
プロパティを表示したい。
@ sa_ddam213が言ったように、HierarchicalDataTemplate
に必要なのはNodeViewModel
だけですが、コードの唯一の問題は中かっこ({
および}
) ために DataType="x:Type local:TreeViewModel"
データテンプレート定義内(DataType="{x:Type local:TreeViewModel}"
)。大括弧とItemsSource
バインディングを追加すると、問題が解決します。
HierarchicalDataTemplate
の追加のTreeViewModel
は使用されませんが、害はありません。
これはHierarchicalDataTemplate
に表示される唯一のものであるため、NodeViewModel
に対してTreeView
を宣言するだけでよく、実際のItemSource
をTreeView
にバインドします。
<TreeView ItemsSource="{Binding Items}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:NodeViewModel}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}"></TextBlock>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
完全な例
XAML:
<Window x:Class="WpfApplication13.MainWindow"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication13"
Title="MainWindow" x:Name="UI" Width="343" Height="744.625" >
<TreeView DataContext="{Binding ElementName=UI, Path=TreeModel}" ItemsSource="{Binding Items}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:NodeViewModel}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}"></TextBlock>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</Window>
コード:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public TreeViewModel TreeModel
{
get
{
return new TreeViewModel
{
Items = new ObservableCollection<NodeViewModel>{
new NodeViewModel { Name = "Root", Children = new ObservableCollection<NodeViewModel> {
new NodeViewModel { Name = "Level1" , Children = new ObservableCollection<NodeViewModel>{
new NodeViewModel{ Name = "Level2"}}} } }}
};
}
}
}
public class TreeViewModel
{
public ObservableCollection<NodeViewModel> Items { get; set; }
}
public class NodeViewModel
{
public string Id { get; set; }
public string Name { get; set; }
public ObservableCollection<NodeViewModel> Children { get; set; }
}
結果: