C# WPF中的绑定数据未更新

C# WPF中的绑定数据未更新,c#,wpf,data-binding,C#,Wpf,Data Binding,我有一个显示一些列表框的应用程序。这些列表框绑定到数据。其中一个列表是门列表,而另一个列表是用户列表 门的列表来自与数据库通信的DataManager类。用户列表来自另一个进行一些计算的类 我已经将两个列表框绑定到它们合适的可观察的getter setter 对于门: public ObservableList<Door> Doors { get { return DataManager.Doors; } } 公共可观察列表门 { 获取{return DataManager

我有一个显示一些列表框的应用程序。这些列表框绑定到数据。其中一个列表是门列表,而另一个列表是用户列表

门的列表来自与数据库通信的DataManager类。用户列表来自另一个进行一些计算的类

我已经将两个列表框绑定到它们合适的可观察的getter setter

对于门:

public ObservableList<Door> Doors
{
    get { return DataManager.Doors; }
}
公共可观察列表门
{
获取{return DataManager.Doors;}
}
对于用户:

public ObservableList<User> Users
{
    get { return classLogic._users; }
}
公共可观察列表用户
{
获取{return classLogic.\u users;}
}

问题来了。添加或删除门时,UI上的列表将更新。添加或删除用户时,列表不会更新。我必须重新加载视图(重新启动应用程序)才能更新它。我错过了什么?为什么不工作?

一个可观察的集合为每个项目的属性引发PropertyChanged
就像你有一个IsDoorClosed属性,它会更新

删除元素会在Doors上引发CollectionChanged事件,但UI不会更新,因为 绑定属性门上未引发PropertyChanged事件

您需要在每个集合更改的门上引发门上的PropertyChanged事件

大致如下:这是psado代码,在这里作为示例编写 为了您的利益,请检查语法错误

 Doors.CollectionChanged += OnDoorsCollectionChanged; 


 private static void OnDoorsCollectionChanged(object sender , CollectionChangedEventArgs e)
 {
      PropertyChanged(sender,new PropertyChangedEventArgs("Doors"));
 }

我发现自己需要完成三个步骤。我认为更新列表框不需要PropertyChanged事件。这可能是从.NET4.0开始的,因为我已经阅读了下面的版本,数据绑定还不是很正确

第一步是列表必须是
私有静态可观察列表
。第二,这个列表的getter也必须是appropiate类型。这意味着在我的例子中,以下代码需要在类逻辑中:

private static readonly ObservableList<User> _users= new ObservableList<User>();

public static ObservableList<User> Users
{
    get { return _users; }
}
private static readonly ObservableList\u users=new ObservableList();
公共静态可观察列表用户
{
获取{return\u users;}
}
第三件事是,在DataContext类中调用此函数(getter)将数据绑定到ListBox时,必须使用类名,而不是该类的实例

因此,在这种情况下:

/// <summary>
/// Gets the Users that are managed by the ClassLogic class
/// </summary>
public ObservableList<User> Users
{
    get { return ClassLogic.Users; }
    //wrong would be:
    //get { return classLogic.Users }
}
//
///获取由ClassLogic类管理的用户
/// 
公共可观察列表用户
{
获取{return ClassLogic.Users;}
//错误是:
//获取{return classLogic.Users}
}

这三个步骤绑定了我的数据,并确保列表框在列表内容更新时也会更新。

好的,我添加了一个示例,我不知道您的集合位于何处,但您需要在“Doors”属性的DataContext中引发PropertyChanged。还要注意的是,我在这里写的,不是在VS中写的,所以要考虑语法错误。尽管如此,用户的列表框还是会得到更新。这是怎么可能的?你能发布classLogic的CS吗?\u用户和DataManager.Doors进行比较,我想我大致了解为什么会发生这种情况?你这是什么意思?我只是使用lists.Add()方法。。。请注意,门可以工作,但用户不能。反过来说:)好吧,我错了,不管怎样,我都想看看集合是如何定义的。很好,我想知道在什么情况下集合属性上需要PropertyChanged事件我回忆起需要它的情况。我的想法完全正确。也许当列表从一开始就不可见时?我想到的是外部应用程序或更新的东西不是列表,而是图像……在更新列表时更改ObservableCollection与更改存储在集合中的项之间有区别。如果集合中的项已更改,则可以使用INotifyPropertyChanged。发件人: