2

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

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

我已经将两个 ListBox 绑定到它们适当的 ObservableList getter setter。

对于门:

public ObservableList<Door> Doors
{
    get { return DataManager.Doors; }
}

对于用户:

public ObservableList<User> Users
{
    get { return classLogic._users; }
}

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

4

2 回答 2

2

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

移除元素会在 Doors 上引发 CollectionChanged 事件,但 UI 不会更新,因为未在 Bound Property Doors 上引发 PropertyChanged 事件。

您需要在 Doors 的每个 CollectionChanged 上引发 PropertyChanged 事件。

大意是这样的:这是 psado 代码,它是为了您的利益而写在这里作为示例的,因此请检查是否有任何语法错误。

 Doors.CollectionChanged += OnDoorsCollectionChanged; 


 private static void OnDoorsCollectionChanged(object sender , CollectionChangedEventArgs e)
 {
      PropertyChanged(sender,new PropertyChangedEventArgs("Doors"));
 }
于 2013-04-02T09:42:36.487 回答
1

我发现自己需要完成三个步骤。我认为更新 ListBox 不需要 PropertyChanged 事件。这可能是从 .NET 4.0 开始,因为我在下面的版本中阅读过,数据绑定还不是真正正确的。

第一步是列表必须是private static ObservableList<...>. 第二个是这个列表的 getter 也必须是适当的类型。这意味着在我的情况下,以下代码需要在 ClassLogic 中:

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

public static ObservableList<User> Users
{
    get { return _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 }
}

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

于 2013-04-04T06:53:13.870 回答