【发布时间】:2013-03-02 01:33:36
【问题描述】:
当集合的属性发生更改时,我在更新包含 ObservableCollection 的列表框时遇到问题(从列表中添加/删除项目可以正常工作):
listbox 已设置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 一直显示旧数据
【问题讨论】:
-
为了提供帮助,您必须发布一个 Xaml 示例,以及一个显示属性更改通知的 ViewModel 实现示例。
-
提供你的类的实现
allPersonClass -
我想我需要睡觉,然后我会调查一下并发布我的进度
-
那个属性改变的饲养员让我紧张不安。值得庆幸的是,至少有一个答案解决了这个问题。
标签: c# wpf data-binding observablecollection