当集合的属性发生更改时,我在更新包含 ObservableCollection 的列表框时遇到问题(从列表中添加/删除项目工作正常):
列表框已设置ItemsSource="{Binding Path=AllPerson}"
,后面代码中的数据上下文设置如下this.DataContext = allPersonClass;
。
allPersonClass
包含ObservableCollection<Person> allPerson
类Person
包含名称等属性。
我已经覆盖了人员ToString
返回Name
属性的方法,因此 listBox 显示有效数据
我试图Person
实现INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
private void onPropertyChanged(object sender, string propertyName) {
if (this.PropertyChanged != null) {
PropertyChanged(sender, new PropertyChangedEventArgs(propertyName));
}
}
public string Name {
get { return name; }
set {
name = value;
onPropertyChanged(this, "allPersonClass");
}
}
并在每个属性设置器中onPropertyChanged(this, "propertyName");
执行但 listBox 从不更新已创建的项目
知道可能出了什么问题吗?
这是带有 listBox xaml 的窗口
<Button x:Name="btnDetail" Content="Detail" HorizontalAlignment="Left" Margin="361,249,0,0" VerticalAlignment="Top" Width="75" Click="ButtonDetailClick"/>
<ListBox x:Name="listPerson" ItemsSource="{Binding Path=AllPerson}" HorizontalAlignment="Left" Height="170" Margin="33,29,0,0" VerticalAlignment="Top" Width="155" IsSynchronizedWithCurrentItem="True"/>
<Button x:Name="btnLoad" Content="Load" HorizontalAlignment="Left" Margin="58,249,0,0" VerticalAlignment="Top" Width="75" Click="btnLoad_Click"/>
<Button x:Name="btnSave" Content="Save" HorizontalAlignment="Left" Margin="138,249,0,0" VerticalAlignment="Top" Width="75" Click="ButtonSaveClick"/>
这是进行修改的 DetailView 窗口的一部分(绑定到 Person)
<TextBox Text="{Binding Path=Name}" Height="23" HorizontalAlignment="Left" Margin="118,20,0,0" Name="txtName" VerticalAlignment="Top" Width="141" />
这是 AllPersonClass 的一部分:
public class AllPersonClass {
private ObservableCollection<Person> allPerson;
public AllPersonClass() {
allPerson = new ObservableCollection<Person>();
}
public ObservableCollection<Person> AllPerson {
get { return allPerson; }
set { allPerson = value; }
}
public void addPerson(Person newPerson) {
allPerson.Add(newPerson);
}
public Person getPerson(int personIndex) {
return allPerson[personIndex];
}
}
编辑
这是在详细视图中保存更改的方法的相关部分
private void OnBtnSaveClick(object sender, RoutedEventArgs e) {
person.Name = txtName.Text;
person.SurName = txtSurName.Text;
}
请注意,在“ObservableCollection allPerson”中进行了更改,只有 listBox 一直显示旧数据