WPF TreeView DataBinding:数据未显示,BindingExpression路径错误

时间:2013-03-12 12:45:50

标签: wpf data-binding treeview

我正在为Visual Studio加载项开发新功能。最初项目的目标框架是3.5。但我被要求使用WPF添加一个具有相当复杂UI的工具窗口并切换到4.0框架(可能这很重要) 我正在尝试将分层数据绑定到我的工具窗口中的树视图,该工具窗口最初是一个WPF用户控件。

但我看到以下错误: “System.Windows.Data错误:40:BindingExpression路径错误:'对象'上找不到'PoolList'属性'''OpjectPool'(Name ='')'。BindingExpression:Path = PoolList; DataItem ='OpjectPool'(Name = '');目标元素是'TreeView'(Name ='treeView1');目标属性是'ItemsSource'(类型'IEnumerable')“

这是一个Class,它表示我需要绑定到树视图的数据。

class CodeItem
{
public TextPoint StartPoint { get; set; }
public TextPoint EndPoint { get; set; }
public string Name { get; set; }
public vsCMElement Kind { get; set; }
public CodeElements ChildClasses { get; set; }
public ProjectItem ProjectItem { get; set; }
public List<CodeItem> CodeItems { get; set; }
public string Label { get; set; }

public CodeItem(CodeElement el)
{
    StartPoint = el.StartPoint;
    EndPoint = el.EndPoint;
    Name = el.Name;
    Kind = el.Kind;
    ChildClasses = el.Children;
    ProjectItem = el.ProjectItem;
    Label = Kind.ToString();

    CodeItems = new List<CodeItem>();
    if (ChildClasses.Count != 0)
    {
        foreach (CodeElement elem in ChildClasses)
        {
            if (elem.Kind.ToString() == "vsCMElementClass")
            {
                CodeItems.Add(new CodeItem(elem));
            }
        }
    }
}
}

这是我的UserControl代码:

public partial class OpjectPool : UserControl
{
    public ObservableCollection<CodeItem> PoolList = new ObservableCollection<CodeItem>();

    public OpjectPool()
    {

        Project pr = ... // getting VS Project we want to work with;

        foreach (ProjectItem item in pr.ProjectItems.Item("Objects").ProjectItems)
        {
            if (item.FileCodeModel != null)
            {
                CodeItem rootPoolItem = new CodeItem(item.Name);

                foreach (CodeElement el in item.FileCodeModel.CodeElements)
                {
                    if (el.Kind.ToString() == "vsCMElementClass" || el.Kind.ToString() == "vsCMElementNamespace")
                    {
                        CodeItem ci = new CodeItem(el);

                        rootPoolItem.CodeItems.Add(ci);

                    }
                }

                PoolList.Add(rootPoolItem);
            }
        }

        InitializeComponent();

        this.treeView1.DataContext = this;
   }
}

这是一个XAML代码:

<UserControl x:Class="******.OpjectPool"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300">
<Grid Height="Auto" Name="maingrid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
        <ColumnDefinition Width="1*" />
    </Grid.ColumnDefinitions>
    <ScrollViewer Grid.Column="0" Height="Auto" HorizontalAlignment="Stretch" Name="scrollViewer1" VerticalAlignment="Stretch" Width="Auto" HorizontalScrollBarVisibility="Visible">
        <TreeView Height="Auto" Name="treeView1" Width="Auto" ItemsSource="{Binding PoolList}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding CodeItems}" >
                    <TreeViewItem Header="{Binding Label}"/>
                </HierarchicalDataTemplate >
             </TreeView.ItemTemplate>
        </TreeView>
    </ScrollViewer>
    <ScrollViewer Grid.Column="1" Height="Auto" HorizontalAlignment="Stretch" Name="scrollViewer2" VerticalAlignment="Stretch" Width="Auto" HorizontalScrollBarVisibility="Visible" Grid.ColumnSpan="1">
        <DataGrid AutoGenerateColumns="False" Height="Auto" Name="dataGrid1" Width="Auto" FrozenColumnCount="3" />
    </ScrollViewer>
    <ScrollViewer Grid.Column="2" Height="Auto" HorizontalAlignment="Stretch" Name="scrollViewer3" VerticalAlignment="Stretch" Width="Auto" HorizontalScrollBarVisibility="Visible" Grid.ColumnSpan="1">
        <DataGrid AutoGenerateColumns="False" Height="Auto" Name="dataGrid2" Width="Auto" />
    </ScrollViewer>
    <GridSplitter Grid.Column="1" Name="gridSplitter1" ResizeDirection="Columns" BorderBrush="Black" Background="Black" Margin="0,0,0,0" Grid.ColumnSpan="1" HorizontalAlignment="Left" Width="2" />
    <GridSplitter Grid.Column="2" Name="gridSplitter2" ResizeDirection="Columns" BorderBrush="Black" Background="Black" Margin="0,0,0,0" Grid.ColumnSpan="1" HorizontalAlignment="Left" Width="2" />
</Grid>

PoolList不为null并且包含我需要绑定的完整层次结构。 有趣的是,错误消息说明了对象的真实属性而非空属性

1 个答案:

答案 0 :(得分:1)

错误说明:

BindingExpression路径错误:'object'''OpjectPool'(Name ='')'上找不到'PoolList' PROPERTY 。 BindingExpression:路径= PoolList;

PoolList不是属性。