【问题标题】:Updating the listbox after adding a new item添加新项目后更新列表框
【发布时间】:2010-07-27 12:16:35
【问题描述】:

我正在使用 WPF 和 C# 我有一个打开一个窗口的按钮,其中还包括一个将用户对象项添加到列表框的按钮,我希望在插入后更新列表框索引。我知道解决方案是关于使用 INotifyCollectionChanged 的​​可观察类,但实际上我不知道如何以及在哪里使用它们。你能帮我确定实施、注册、解雇等的内容和地点吗?


编辑: 我在 Quartermeister 的帮助下成功了,我的用户对象被收集在一个列表中,但现在我想做同样的事情,我的对象被收集在一个字典中

【问题讨论】:

    标签: c# wpf listbox event-handling


    【解决方案1】:

    最简单的方法是使用System.Collections.ObjectModel.ObservableCollection<T> 作为您的列表。这为您实现了INotifyCollectionChangedINotifyPropertyChanged

    您将在此类型的 DataContext 对象上拥有一个属性,并使用 ListBox.ItemsSource 上的数据绑定将其绑定到该属性。 ListBox 将在集合更改时自动更新其元素列表。

    在你的 DataContext 类中:

    public class MyClass
    {
        public ObservableCollection<string> Items { get; set; }
    }
    

    在 Xaml 中:

    <ListBox ItemsSource="{Binding Items}">
    </ListBox>
    

    听起来你也想要一个可观察的字典,但不幸的是框架中没有内置的。您可以尝试使用 Wpf 博士在他的帖子"Can I bind my ItemsControl to a dictionary?" 中实现的 ObservableDictionary。

    【讨论】:

    • 这是一个非常简单且有用的解决方案。非常感谢=)
    • 还有一个问题:如果我想使用字典而不是列表怎么办?我该如何处理?
    • 我刚刚找到了一个 keyedcollection,现在正在尝试。我希望它有效=)t
    • 好吧,keyedcollection 的关键字段似乎是只读的——所以我仍然需要帮助=)
    【解决方案2】:

    实现一个可观察的字典很难。维护一个包含字典值的并行可观察集合要简单得多。将视图绑定到该集合,并确保任何在字典中添加或删除值的代码都会更新字典和并行集合。

    如果你真的想发疯,你可以实现一个ObservableCollection 的子类来保存你的对象,并使该类维护字典,例如:

    public class KeyedObject
    {
        public string Key { get; set; }
        public object Value { get; set; }
    }
    
    public class ObservableMappedCollection : ObservableCollection<KeyedObject>
    {
        private Dictionary<string, KeyedObject> _Map;
    
        public ObservableMappedCollection(Dictionary<string, KeyedObject> map)
        {
            _Map = map;    
        }
    
        protected override void InsertItem(int index, KeyedObject item)
        {
            base.InsertItem(index, item);
            _Map[item.Key] = item;
        }
    
        protected override void RemoveItem(int index)
        {
            KeyedObject item = base[index];
            base.RemoveItem(index);
            _Map.Remove(item.Key);
        }
    
        protected override void ClearItems()
        {
            base.ClearItems();
            _Map.Clear();
        }
    
        protected override void SetItem(int index, KeyedObject item)
        {
            KeyedObject oldItem = base[index];
            _Map.Remove(oldItem.Key);
            base.SetItem(index, item);
            _Map[item.Key] = item;
        }
    }
    

    上面有很多潜在的问题,主要与重复的键值有关。例如,如果您要添加一个其键已经在地图中的对象,SetItem 应该怎么做?答案实际上取决于您的应用程序。类似的问题也暗示了为什么框架中没有可观察的字典类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      相关资源
      最近更新 更多