我想使用HierarchicalDataTemplate类创建一个简单的TreeView。
这是我的问题XAML:
<Window.Resources>
<ObjectDataProvider
x:Key="myDataProvider"
ObjectType="vm:ContractViewModel" />
</Window.Resources>
<Window.DataContext>
<Binding Source="{StaticResource myDataProvider}" Path="Contract" />
</Window.DataContext>
<StackPanel
Orientation="Vertical"
VerticalAlignment="Top">
<ListBox MinWidth="400" Margin="10"
ItemsSource="{Binding Commissions}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Id}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TreeView>
<HierarchicalDataTemplate DataType="{x:Type m:Contract}"
ItemsSource="{Binding Commissions}">
<TextBlock Text="{Binding Id}" />
</HierarchicalDataTemplate>
</TreeView>
</StackPanel>
我正在使用MVVM模式。 StaticResource“myDataProvider”返回Contract(自定义)类的实例。这是我的模特:
internal class Contract
{
public string Name { get; set; }
public ObservableCollection<Commission> Commissions { get; set; }
}
internal class Commission
{
public string Id { get; set; }
}
仅供参考 - 我的模型实际上更复杂;我的类包含的成员多于显示的成员,它们有构造函数,并且它们实现了INotifyPropertyChanged。
在我的测试中,我将两个Commission对象加载到Contract对象中。列表框按预期工作:我可以在合同中看到每个委员会对象的ID。 TreeView不起作用:它在TreeView控件中返回一个“System.Windows.HierarchicalDataTemplate”字符串,我希望列出每个委员会ID。
我提到other posts和MSDN无济于事。我很感激你的帮助!
答案 0 :(得分:0)
据我所知,你没有在XAML中正确使用TreeView
。您需要将HierarchicalDataTemplate
置于TreeView.Resources
级别并指定ItemsSource
如图here所示,您要设置项目的模板。
尝试做这样的事情:
<TreeView ItemsSource="{Binding Contracts}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type m:Contract}"
ItemsSource="{Binding Commissions}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type m:Commission}"
ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Id}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
我个人这样做 - 使用RadTreeView:
<telerik:RadTreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type vm:BaseType}"
ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Title}" />
</HierarchicalDataTemplate>
</telerik:RadTreeView.ItemTemplate>