WPF繫結(Binding)繫結物件集合修改顯示屬性問題
阿新 • • 發佈:2019-02-14
問題描述:
我打算選中列表中的欄位,用文字框的值替換選中的欄位。
然而在使用Binging將存放自定義類(Student)的集合繫結到ListBox上,顯示的是這個類的“Name”屬性。在修改這個屬性後卻沒有看到列表中選中欄位的變化。
ListBox取值繫結儲存Sutdent類的物件。
之所以用ObservableCollection是因為:(出自《深入淺出WPF》)
ObservableCollection<Student> oc = new ObservableCollection<Student>(); public MainWindow() { InitializeComponent(); oc.Add(new Student("kobe")); oc.Add(new Student("jordan")); oc.Add(new Student("tracy")); this.listBox.ItemsSource = oc;//繫結資料來源為集合 this.listBox.DisplayMemberPath = "Name";//顯示為Student類Name屬性 }
Student類:
class Student
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public Student(string name)
{
this.Name = name;
}
}
Button事件:
private void Button_Click(object sender, RoutedEventArgs e) { int selectInedx = this.listBox.SelectedIndex; if(selectInedx>=0) oc[selectInedx].Name = this.textBox.Text; }
最後卻發現,即便是點選事件修改了選中物件的Name屬性後列表中的名字並沒有改變。而這並不符合介紹的資料繫結的特點,於是找了很多地方最終在這裡找到了解決方法。
原來,儲存在集合中的自定義類的顯示的屬性必須實現INotifyPropertyChanged介面,這樣屬性值發生變化時會觸發PropertyChanged事件進而可以使ListBox顯示內容改變。具體程式碼如下:
class Student : INotifyPropertyChanged { private string name; public string Name { get { return name; } set { name = value; if (this.PropertyChanged != null)//重要部分 { this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name")); } } } public Student(string name) { this.Name = name; } public event PropertyChangedEventHandler PropertyChanged; }