0

所以我有三件事:

  • 窗口中的列表框
  • 授予我访问 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;
    }

正确答案在评论中,再次感谢!

4

1 回答 1

1

如果您的项目属性已更改这是一个已知问题,您的问题ObservableCollection不会得到通知
要解决此问题,您需要将您的INotifyPropertyChanged事件连接到您的CollectionChanged事件ObservableCollection

在这里,您可以看到一个示例,您可以如何做到这一点。

于 2013-03-22T11:12:09.120 回答