我有一个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}"
。
答案 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}">