添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在WPF MVVM(模型-视图-视图模型)架构中,数据绑定是实现UI与后端逻辑分离的关键特性。为了使UI能够响应后端数据的变化,通常需要用到特定的集合类型。在WPF中,最常见的两种集合类型是List< T>和ObservableCollection< T>。本文将详细介绍这两种集合类型的区别和使用场景。

1.List< T>:

List 是 C# 中最基本的集合类型之一,它实现了泛型接口 IList< T>,提供了对元素的高效访问和操作。然而,在 WPF MVVM 中使用 List 时,存在以下一些限制和不足:

  • List< T> 是 System.Collections.Generic 命名空间中的一个类,它是一个动态数组,提供了集合的通用接口。
  • 不具备通知能力: 它是不可观察的,意味着当集合中的项添加、移除或更改时,不会自动通知绑定到该集合的 UI 元素。
  • 不适合数据绑定: 使用 List< T> 时,通常需要在 ViewModel 中实现 INotifyPropertyChanged 接口,手动管理属性的变化,以便 UI 可以响应这些变化。
  • 非线程安全: List 不是线程安全的,如果需要在多个线程中对集合进行操作,就需要手动处理线程同步问题,可能会引入潜在的 bug。
List<string> items = new List<string> { "Item1", "Item2", "Item3" };
items.Add("Item4"); // 需要手动更新UI

2. ObservableCollection< T>:

ObservableCollection 是专门为在 WPF 中实现数据绑定而设计的集合类,它实现了 INotifyCollectionChanged 接口,具有以下优势:

  • 实时更新 UI: 当集合发生变化时,ObservableCollection 会自动触发通知,通知 View 层更新数据,从而实现实时的 UI 更新。

  • 适合数据绑定: 由于具备通知能力,可以直接与 View 层进行数据绑定,简化了开发工作,并提高了用户体验。

  • 线程安全: ObservableCollection 实现了线程安全的 ICollection 接口,因此可以在多个线程中安全地对集合进行操作。

  • 适用于动态数据: 特别适用于需要经常变化的数据集合,如动态列表、实时更新的数据等场景。

ObservableCollection<string> items = new ObservableCollection<string>();
items.Add("Item1");
items.Add("Item2");
// 当items集合更改时,绑定的UI元素会自动更新

3.使用建议

  • 如果你不需要在UI中自动更新集合的变化,可以使用List< T>。这种情况通常适用于一些不直接与用户交互的后端数据存储。
  • 如果你需要在UI中显示和编辑集合中的数据,建议使用ObservableCollection< T>。这可以使UI界面上绑定的控件自动响应集合的变化,提高开发效率。

以下是一个简单的示例,展示了如何在WPF MVVM中使用ObservableCollection< T>。

public class MyViewModel
    private ObservableCollection<string> _items;
    public MyViewModel()
        _items = new ObservableCollection<string>();
        _items.Add("Item1");
        _items.Add("Item2");
        _items.Add("Item3");
    public IEnumerable<string> Items
        get { return _items; }
    // 当集合发生变化时,这里的方法会被调用
    public event NotifyCollectionChangedEventHandler CollectionChanged;
    protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
        var handler = CollectionChanged;
        if (handler != null)
            handler(this, e);
    // 添加新项的方法
    public void AddItem(string item)
        _items.Add(item);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));

在这个示例中,Items属性返回一个ObservableCollection< string>,它可以被绑定到UI中的列表控件。当在ViewModel中添加新的项时,AddItem方法会触发CollectionChanged事件,自动通知UI项.

4.性能考虑

虽然ObservableCollection提供了便利的自动通知功能,但它也带来了一些性能开销。每次集合发生变化时,它都会触发事件,这可能会导致如果集合变化非常频繁,UI会有明显的延迟。因此,在性能敏感的场景下,如果集合变化不频繁,使用List可能会更加高效。

在WPF MVVM中,选择List还是ObservableCollection取决于你的需求:

  • 使用List< T>:
  1. 当集合不直接与UI交互时。
  2. 当需要最小的性能开销时。
  3. 当你需要自定义集合的变化通知时。
  • 使用ObservableCollection:
  1. 当需要在UI中显示和编辑集合数据时。
  2. 当集合变化需要自动反映到UI时。
  3. 当你希望减少代码量,简化开发流程时。

6.最佳实践

在实际开发中,以下是一些最佳实践:

  1. 默认使用ObservableCollection,因为它与WPF的数据绑定特性更加契合。
  2. 如果确实需要性能优化,并且集合变化不频繁,可以考虑使用List。
  3. 如果使用List,确保实现INotifyPropertyChanged接口,以便能够正确地通知UI集合的变化。
  4. 在大型项目中,可以使用依赖注入和接口来解耦ViewModel和View,这样即使改变了集合的实现,View也不会受到影响。

在WPF MVVM中,正确选择集合类型对于实现高效和易维护的代码至关重要。List和ObservableCollection各有优势和限制,了解它们的特点并根据实际需求做出选择,将有助于提升开发效率和应用程序质量。

ObservableCollection添加一行时,会自动通知绑定该ObservableCollection的控件并做相应修改。如果希望当ObservableCollection的属性发生改变时通知UI,则T也需要继承于INotifyPropertyChanged。WPF提供一个强大的类(ObservableCollection )可以简化我们对界面集合显示的增删改操作,并且无刷新,这无疑是对用户对我们程序员都非常有用的。接下来我们添加一个简易的界面。界面很粗糙,随意弄得。 相对于System.Linq的OrderBy及OrderByDescending方法,调用后产生IOrderedEnumberable对象,这个对象为排序后的返回值,但原对象未发生变化。试想,有这种需求,ObservableCollection调用排序方法后,此对象也跟着排序,怎么做呢?只能自己写个扩展方法了,方法内使用的冒泡排序算法,非常简单,当然使用是更简单、方便了。 注意:将方法写为扩展方法更方便: class Student int id; string name; ObservableCollection listDatas=new ObservableCollection(); listData.Add(new Student(){id=2,name="xiaoming"}; listData.Add(new Student(){id=1,name="李华"}; listData.Add(new Student(){id=3,name="张度"}; listDatas.OrderBy(cu=>cu.id,true);//按ID升序排序 listDatas.OrderBy(cu=>cu.id,false);//按ID降序排序 listDatas.OrderBy(cu=>cu.name,false);//按名称升序排序 ObservableCollectionList区别总结 区别它们,最简单的方法就是看看他们继承的类和接口,还有它们的方法。(学习有技巧,会让你事半功倍,效率提升。) ObservableCollection比较简单,继承了Collection, INotifyCollectionChanged, INotifyPropertyChanged Collection:为泛型集合提供基类。code INotifyCollectionChanged:将集合的动态更改通知给侦听器,例如,什么时 ObservableCollection基本使用如上述代码示例所示。其要注意的是,替换ViewModel的绑定对象并不能真实替换ItemSource。还有ObservableCollection不是线程安全的,ItemSource绑定其后,不能跨线程(UI线程外)修改ObservableCollection,关于这点会另辟文进行介绍。 C#集合类ObservableCollection类似于泛型列表类List,表示一个动态数据收集,该集合在添加或删除项或刷新整个列表时提供通知。所在命名空间:System.Collections.ObjectModel继承关系:参考微软官方网站有两个重要的事件实现注解在许多情况下,你使用的数据是 对象的集合。例如,数据绑定的常见方案是使用 ItemsControl (如 、 ListView或 TreeView )ListBox来显示记录集合。 WPFListBox、ListView、TreeView等实现数据双向绑定经常会用到ObservableCollection<T>类。 ObservableCollection<T>类 表示一个动态数据集合,它是实现了INotifyPropertyChanged 接口的数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。如果要实现集合的某字段或属... 在本篇文章,我们详细介绍了`ObservableCollection`在WPF的使用。通过定义和初始化`ObservableCollection`,将其绑定到UI控件,以及动态更新集合数据,我们可以创建一个响应式的用户界面。在实际开发,`ObservableCollection`是非常有用的工具,可以帮助我们简化数据绑定的实现,提高应用程序的交互性和响应性。 ​WPF 提供ObservableCollection类,该类是实现INotifyCollectionChanged接口的数据收集的内置实现。 public class ObservableCollection : Collection, INotifyCollectionChanged, INotifyPropertyChanged 2. 还有一种情况(T类型) 对象的属性 发生变化时 需要通知到UI界面,此时就需要T类型实现 INotifyPropertyChange接口。当我们new一个对象赋值给infos时候,infos的地址指向变更了。由此可见 WPF的数据绑定 要求绑定的对象不能发生变化,也就是赋值给DataContext的对象地址不能发生变化, 变化的只是对象里面的属性.1. ObservableCollection 类 表示一个动态数据集合,在添加项、移除项或刷新整个列表时,此集合将提供通知。