所以我有三件事:
在我的主窗口中,我有三个按钮(一个用于新列表条目,一个用于编辑,一个用于删除项目)
我填写这样的列表:
lbKontakte.ItemsSource = DB.GetInstance().Kontakte;
而Kontakte是一个ObservableCollection
我可以使用
创建一个新条目DB.GetInstance().Kontakte.Add(New Kontakt(...));
或使用
删除条目DB.GetInstance().Kontakte.Remove(...);
Boh动作在ListBox中立即可见。
如果我修改了一个值,我没有使用任何代码。我有一个TextBox,它绑定到联系人的Name字段。如果我对其进行更改,理论上应该立即对绑定的联系对象执行更改。
但是,如果我确实修改了文本,则更改不会在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")); }
}
编辑:文本框不是主窗口的一部分,但如果用户单击编辑按钮,则窗口显示为对话框。然后,Window将在构造函数中将selectedItem转换为Kontakt。像这样绑定到场:
<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;
}
答案 0 :(得分:1)
如果您的商品属性发生了已知问题,则您的问题ObservableCollection
无法收到通知。要解决此问题,您需要将INotifyPropertyChanged
事件连接到来自CollectionChanged
ObservableCollection
事件
Here你可以看到一个如何做到这一点的例子。