问题描述:

我打算选中列表中的字段,用文本框的值替换选中的字段。
然而在使用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;
}
本文探讨了在WPF中使用Binding绑定ObservableCollection中的自定义类对象时,如何处理显示属性更新的问题。当修改选中Student对象的Name属性后,列表并未实时更新。原因是Student类的Name属性需要实现INotifyPropertyChanged接口,以便在属性变化时通知视图进行刷新,从而达到数据绑定的预期效果。
3479

被折叠的 条评论
为什么被折叠?



