【发布时间】:2013-03-22 10:40:29
【问题描述】:
所以我有三件事:
- 窗口中的列表框
- DataBase 类授予我访问 ObservableList 的权限
- Contact 实现 INotifyChanged
在我的主窗口中,我有三个按钮(一个用于新列表条目,一个用于编辑,一个用于删除项目)
我这样填写列表:
lbKontakte.ItemsSource = DB.GetInstance().Kontakte;
而 Kontakte 是一个 ObservableCollection
我可以使用
创建一个新条目DB.GetInstance().Kontakte.Add(New Kontakt(...));
或使用删除条目
DB.GetInstance().Kontakte.Remove(...);
Boh 动作在 ListBox 中立即可见。
如果我修改一个值,我没有使用任何代码。我有一个绑定到联系人姓名字段的文本框。如果我对其进行更改,理论上应该立即对绑定的联系人对象进行更改。
但是,如果我确实修改了文本,则更改不会在 ListBox 中变得可见。如果我暂停代码并查看对象,我可以看到它的名称字段已正确更改。
为什么我的 ListBox 没有更新?
PS: 联系人确实使用以下代码实现了 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;
}
评论中的正确答案,再次感谢!
【问题讨论】:
-
您的问题是
ObservableCollection在您的项目属性发生更改时不会收到通知 -
如何指定如何在 ListBox 中显示项目?你使用 DisplayMemberPath 吗?
-
那我该如何改变我的问题呢?
-
Botz:我只使用我在问题中写的Binding。
-
看看这个Link