【问题标题】:wpf itemlist not updating valueswpf itemlist不更新值
【发布时间】: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

标签: c# .net wpf listbox


【解决方案1】:

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

Here你可以看到一个例子,你可以怎么做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    相关资源
    最近更新 更多