所以我有三件事:
- 窗口中的列表框
- 授予我访问 ObservableList 的数据库类
- 联系人实现 INotifyChanged
在我的主窗口中,我有三个按钮(一个用于新列表条目,一个用于编辑,一个用于删除项目)
我这样填写列表:
lbKontakte.ItemsSource = DB.GetInstance().Kontakte;
而 Kontakte 是 ObservableCollection
我可以使用创建一个新条目
DB.GetInstance().Kontakte.Add(New Kontakt(...));
或使用删除条目
DB.GetInstance().Kontakte.Remove(...);
Boh 动作在 ListBox 中立即可见。
但是,如果我修改一个值,我没有使用任何代码。我有一个绑定到联系人姓名字段的文本框。如果我对其进行更改,理论上应该立即对绑定的联系人对象进行更改。
但是,如果我确实修改了文本,则更改不会在 ListBox 中变得可见。如果我暂停代码并查看对象,我可以看到它的名称字段已正确更改。
为什么我的 ListBox 没有更新?
PS:Contact 确实使用以下代码实现了 INotifyChanged:
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
{
PropertyChanged(this, e);
}
}
和
public String Name
{
get { return _name; }
set { _name = value; OnPropertyChanged(new PropertyChangedEventArgs("Name")); }
}
编辑:文本框不是主窗口的一部分,但如果用户单击编辑按钮,则窗口显示为对话框。然后在 Constructor 中为 Window 提供转换为 Kontakt 的 selectedItem。像这样绑定到字段:
<TextBox Name="txtName" Grid.Column="1" Grid.Row="0" Margin="4" Text="{Binding Path=Name}"></TextBox>
和
public KontaktAddUI(Kontakt kontaktToEdit)
{
InitializeComponent();
this.kontaktToEdit = kontaktToEdit;
this.MainGrid.DataContext = kontaktToEdit;
}