1. 程式人生 > >WPF繫結(Binding)繫結物件集合修改顯示屬性問題

WPF繫結(Binding)繫結物件集合修改顯示屬性問題

問題描述:

我打算選中列表中的欄位,用文字框的值替換選中的欄位。

然而在使用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;
    }