WPF - 我在TreeView控件上难以接受

时间:2014-02-11 22:50:37

标签: c# wpf xaml treeview

双关语意图。

我想使用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 postsMSDN无济于事。我很感激你的帮助!

1 个答案:

答案 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>