[英]Binding not working when using listview with an expander in WPF
首先,我是新手,剛剛開始學習WPF。
我有一個雇員班級,如下所示:
public class Employee : INotifyPropertyChanged
{
public Employee()
{
_subEmployee = new ObservableCollection<Employee>();
}
private string _name;
public ObservableCollection<Employee> SubEmployee
{
get { return _subEmployee; }
set
{
_subEmployee = value;
NotifiyPropertyChanged("SubEmployee");
}
}
public string Name
{
get { return _name; }
set
{
_name = value;
NotifiyPropertyChanged("Name");
}
}
ObservableCollection<Employee> _subEmployee;
public event PropertyChangedEventHandler PropertyChanged;
void NotifiyPropertyChanged(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
我在MainWindow類中創建了一個可觀察的雇員集合,並將datacontext設置為相同的集合,如下所示:
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 = Emp;
}
}
現在,在xaml.cs中,我編寫了以下代碼:
<Grid>
<ListView ItemsSource="{Binding Emp}">
<ListView.ItemTemplate>
<DataTemplate DataType="{x:Type vm:Employee }">
<Expander Header="{Binding Name}">
<ListView ItemsSource="{Binding SubEmployee}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text ="{Binding Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Expander>
</DataTemplate>
</ListView.ItemTemplate> >
</ListView>
</Grid>
現在,我應該使用擴展器按鈕來獲取Employee對象的集合,單擊該按鈕應該給我所有的SubEmployee。 但是不幸的是我沒有得到預期的結果。
請幫助我解決綁定問題。
您的DataContext
是ObservableCollection<Employee>
因此外部LitView
應該將ItemsSource
直接綁定到當前DataContext
。 換句話說,您的DataContext
沒有Emp
屬性。 您的上下文是Emp
屬性
<ListView ItemsSource="{Binding}">
<ListView.ItemTemplate>
<!-- .... -->
</ListView.ItemTemplate>
</ListView>
或保留XAML不變,並更改了將DataContext
設置為
this.DataContext = this;
編輯
以為這是復制/粘貼錯誤,但是由於您抱怨無效的操作異常錯誤,這是因為ItemTemplate
標記末尾的第二個>
</ListView.ItemTemplate> >
我已經測試過您的代碼。 DataContext
設置不正確。 我還給文本加了顏色。 嘗試這個。 在我的末端完美工作!
XAML:
<Grid>
<ListView ItemsSource="{Binding Emp}">
<ListView.ItemTemplate>
<DataTemplate DataType="{x:Type vm:Employee }">
<Expander Header="{Binding Name}">
<ListView ItemsSource="{Binding SubEmployee}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Foreground="Black" Text ="{Binding Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Expander>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
背后的代碼:
public partial class MainWindow : Window
{
public ObservableCollection<Employee> Emp { get; set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
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" });
}
}
其他數據類保持不變!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.