绑定在treeview WPF中无法正常工作

时间:2016-06-25 19:24:56

标签: c# wpf treeview

我有一个Employee类,如下所示:

public class Employee : INotifyPropertyChanged
    {
        public Employee()
        {
            _subEmployee = new ObservableCollection<Employee>();
        }

        public string Name { get; set; }

        public ObservableCollection<Employee> SubEmployee
        {
            get { return _subEmployee; }
            set
            {
                _subEmployee = value;
                NotifiyPropertyChanged("SubEmployee");
            }
        }

        ObservableCollection<Employee> _subEmployee;

        public event PropertyChangedEventHandler PropertyChanged;
        void NotifiyPropertyChanged(string property)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

我正在Main窗口构造函数中创建一个employee类的集合 并将其添加到可观察的员工集合中,如下所示:

public partial class MainWindow : Window
    {
        public ObservableCollection<Employee> Emp { get; private set; }
        public MainWindow()
        {
            InitializeComponent();
            Emp = new ObservableCollection<Employee>();
            Emp.Add(new Employee(){Name = "Anuj"});
            Emp.Add(new Employee() { Name = "Deepak" });
            Emp.Add(new Employee() { Name = "Aarti" });

            Emp[0].SubEmployee.Add(new Employee(){Name = "Tonu"});
            Emp[0].SubEmployee.Add(new Employee() { Name = "Monu" });
            Emp[0].SubEmployee.Add(new Employee() { Name = "Sonu" });

            Emp[2].SubEmployee.Add(new Employee() { Name = "Harsh" });
            Emp[2].SubEmployee.Add(new Employee() { Name = "Rahul" });
            Emp[2].SubEmployee.Add(new Employee() { Name = "Sachin" });
            this.DataContext = this;
        }      
    }

我已将DataContext设置为self。 现在,在xaml文件中,我创建了树视图和绑定数据的分层模板,如下所示:

<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TreeView ItemsSource="{Binding}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding SubEmployee}">
                    <TextBlock Text="{Binding Name}" />
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

    </Grid>
</Window>

现在,当我保留TreeView ItemsSource="{Binding Emp}"时,绑定正常 我可以在运行代码后看到树视图结构。 但是,当我保留TreeView ItemsSource="{Binding}"时,运行代码后看不到任何结果。

据我了解,保持ItemSource = "{Binding}"意味着我绑定到当前datacontext的评估值。 由于我的datacontext设置为self,ItemSource = "{Binding}"应该意味着我绑定到DataContext的唯一属性,即Emp和我应该得​​到正确的结果。

请帮助我理解我在保持约束力方面遇到的问题 ItemSource = "{Binding}"

1 个答案:

答案 0 :(得分:5)

  

&#34;据我了解,保持ItemSource = "{Binding}"意味着我绑定到当前datacontext的评估值。&#34;

正确而且这就是问题所在。 ItemsSource期望绑定源的类型为IEnumerable,但您绑定到Window

  

&#34; ...应该意味着我绑定到DataContext的唯一属性,即Emp和我应该得​​到正确的结果。&#34;

没有。没有这样的&#34;单一财产&#34;假设存在于WPF绑定约定中。

更改...

this.DataContext = this;

要...

this.DataContext = Emp;

或者,替代地,更改XAML中的绑定并在DataContext上指定要绑定到使用Path的正确成员...

<TreeView ItemsSource="{Binding Path=Emp}">