ReactiveUI MVVM框架(1)-Collections

这篇具有很好参考价值的文章主要介绍了ReactiveUI MVVM框架(1)-Collections。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ReactiveUI MVVM框架(1)-Collections

ReactiveUI使用动态数据(DynamicData)用于集合的操作。

当对动态数据集合进行更改时,会产生更改通知,通知表示为ChangeSet,里面包含了更改信息,多个更改通知为IObservable<ChangeSet>。动态数据提供了两种特定的集合,分别是SourceCache<TObject, TKey>SourceList<T>。第一个为带key的字典式,也就是不能重复,第二个为集合式。如何要将这两种集合转换为IObservable<ChangeSet>,可以使用Connect方法。

需要注意的是,这跟WPF中常用的ObservableCollection<T>的实现方式是不同的。

简单使用

从wpf中常用的ObservableCollection<T>得到IObservable<ChangeSet>

// 'myList' is ObservableCollection<T>
// 'myDerivedList' is IObservableList<T>
var myDerivedList = myList
    .ToObservableChangeSet()
    .Filter(t => t.Status == "Something")
    .AsObservableList();

// 'myList' is ObservableCollection<T>
// 'myDerivedCache' is IObservableCache<T, TKey>
var myDerivedCache = myList
    .ToObservableChangeSet(t => t.Id)
    .Filter(t => t.Status == "Something")
    .AsObservableCache();

以上两种方式是线程不安全的,加入myList绑定到了View上,那么在View上也可能对myList进行更改。推荐的方法是先创建一个数据源。

var myList = new SourceList<T>()
var disposable = myList
    .Connect() // 获得IObservable<ChangeSet>
    .\\some other operation

这种方法的好处是可以在后台线程上进行维护。比如:

//ReadOnlyObservableCollection可以多线程操作
ReadOnlyObservableCollection<T> bindingData;
var disposable = mySource
    .Connect() // make the source an observable change set
    .Sort(SortExpressionComparer<T>.Ascending(t => t.DateTime))
    .ObserveOn(RxApp.MainThreadScheduler) 
    // 'mySource' 会在其他线程上更新
    .Bind(out bindingData)
    .Subscribe(); 

ReactiveUI使用动态数据

开发时,会遇到可变集合和不可变集合,当对不可变集合进行处理时,简单情况下可以使用ObservableAsPropertyHelper<T>,它包含一个Observable<T>。每次给集合赋予新的集合时会触发通知事件。

而对于可变集合,往往采用动态数据的方式。

案例

public class Service 
{
    //定义一个数据集
    private readonly SourceList<bool> _items = new SourceList<bool>();

    //暴露给外面
    public IObservable<IChangeSet<bool>> Connect() => _items.Connect();

    public Service()
    {        
        _items.Add(true);
        _items.RemoveAt(0);
        _items.Add(false);
    }
}

ReadOnlyObservableCollection

  • 动态数据往往使用ReadOnlyObservableCollection<T>之类的类型对外公开,而不是它本身的类型。IObservable<IChangeSet<T>>IObservable<IChangeSet<TObject, TKey>>是可以观测类型,IObservable<IChangeSet<T>>中含有集合更改的内容,第一次使用ToObservableChangeSet()时会发出集合的当前状态。
  • SourceListSourceCache是可以使用多线程进行创建IObservable<IChangeSet<T>>等,通常SourceListSourceCache应该定义为Private,而是通过Connect方法暴露给View。
public class ViewModel : ReactiveObject
{
    private readonly ReadOnlyObservableCollection<bool> _items;
    public ReadOnlyObservableCollection<bool> Items => _items;

    public ViewModel()
    {
        var service = new Service();
        service.Connect()
            // Transform 和Select方法类似,只不过是观察一个集合的变化且将元素投影到另一个集合
            .Transform(x => !x)
            // Filter 类似于Where
            .Filter(x => x)
            // 确保更先到UI线程.
            .ObserveOn(RxApp.MainThreadScheduler)
            // 通过 .Bind() 方法实现可变集合包含新的数据并且刷新UI
            .Bind(out _items)
            .Subscribe();
    }
}

ObservableCollectionExtended

ObservableCollectionExtended<T>是一个单线程集合,如果要同步VM中的两个集合,可以将其中一个声明为ObservableCollectionExtended<T>,另一个声明为ReadOnlyObservableCollection<T>,然后使用.ToObservableChangeSet()方法将其转换为IObservable<IChangeSet<T>>

public class SynchronizedCollectionsViewModel : ReactiveObject
{
    private readonly ReadOnlyObservableCollection<bool> _derived;
    public ReadOnlyObservableCollection<bool> Derived => _derived;

    public ObservableCollectionExtended<bool> Source { get; }

    public SynchronizedCollectionsViewModel()
    {
        Source = new ObservableCollectionExtended<bool>();
        
        Source.ToObservableChangeSet()
            .Transform(value => !value)
            // 在这里不需要使用ObserveOn更新UI线程,因为它是单线程
            .Bind(out _derived)
            .Subscribe();
     
        Source.Add(true);
        Source.RemoveAt(0);
        Source.Add(false);
        Source.Add(true);
    }
}

根据集合中的更改

ReactiveObject类实现了INotifyPropertyChanged,动态数据可以对ReactiveObject类进行跟踪。

// 'collectionOfReactiveObjects' 是 ObservableCollection<T>
//  T inherits 继承自 ReactiveObject
// 'databasesValid' 则是 IObservable<bool>
var databasesValid = collectionOfReactiveObjects
    .ToObservableChangeSet()
    .AutoRefresh(model => model.IsValid) // 订阅IsValid属性的更改
    .ToCollection()                      // 获取新项目集合
    .Select(x => x.All(y => y.IsValid)); // 验证是否满足条件.

// 将IObservable<bool> 转为视图模型
// '_databasesValid' 是ObservableAsPropertyHelper<bool> 类型
_databasesValid = databasesValid.ToProperty(this, x => x.DatabasesValid);

ReactiveList转为动态数据

如果使用的是ReactiveList<T>,并且仅从UI线程添加/删除,则使用ObservableCollectionExtended<T>文章来源地址https://www.toymoban.com/news/detail-704896.html

到了这里,关于ReactiveUI MVVM框架(1)-Collections的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Net跨平台UI框架Avalonia入门-安装和使用(v11版本)

    avalonia v11 版本发布了,增加了很多新的功能,Avalonia的扩展也同步升级了。 主要更新内容: 辅助功能:增加了对各种辅助工具的支持,提高了Avalonia应用程序的可用性。 输入法编辑器(IME)支持:允许在所有语言中使用屏幕键盘和输入。 合成渲染器:提供更强大、高效和灵

    2024年02月09日
    浏览(64)
  • Android技术框架篇(三):MVVM框架

    目录 一、MVVM架构的基本概念 二、MVVM架构的核心思想 三、MVVM架构的实现方式 四、MVVM架构的优缺点 五、MVVM架构的应用场景 以下是MVVM架构的基本概念的简要总结: 概念 描述 Model 数据和业务逻辑的层,负责管理数据的获取、存储和处理。 View 用户界面层,负责展示数据和与

    2024年02月12日
    浏览(92)
  • Vue框架--理解MVVM

            我们知道, MVVM 是 Model-View-ViewModel 的简写。它本质上就是MVC的改进版。我们看看MVVM的模型架构,如下所示: 架构理解与实例

    2024年02月10日
    浏览(38)
  • wpf自定义Mvvm框架

    1.DelegateCommand.cs NotificationObject.cs

    2024年02月16日
    浏览(33)
  • Wpf在.Net 6 下该用哪个Mvvm框架-Microsoft.Toolkit.Mvvm

    前言 在Wpf下最常使用的就是Mvvm模式了,有自己造轮子构建Mvvm框架的,也有使用现成的开源项目,我之前一直使用的是轻量级的MvvmLight了,这个框架还是非常不错的,使用也简单,不占用太大空间,其中最喜欢的莫过于全局Messenger了,可谓是神器。最近有个项目使用.Net6开发

    2024年02月06日
    浏览(50)
  • WPF 使用MVVM框架创建一个项目

    步骤如下: 1、打开Visual Studio 2017(或其他版本),选择新建项目 2、选择WPF应用(.Net Framework),同时给项目命名,并选择项目存放路径,最后点击确定 3、右键点击解决方案名称,点击“管理NuGet程序包”,点击浏览,在输入框中输入mvvmlight,点击MvvmLight进行安装,安装过程

    2024年02月05日
    浏览(65)
  • 第12章_集合框架(Collection接口,Iterator接口,List,Set,Map,Collections工具类)

    1.1 生活中的容器 1.2 数组的特点与弊端 一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。 另一方面,使用数组存储对象方面具有 一些弊端 ,而Java 集合就像一种容器,可以 动态地 把多个对象的引用放入容器中。 数

    2024年01月25日
    浏览(43)
  • 工业上位机开发实战 WPF + MVVM 框架

    上一篇博客介绍了上位机实现MVVM 框架的步骤 MVVMtoolkit 学习_叮当说的博客-CSDN博客 下面我们继续来讲解下实现上位机中会遇到的一些小问题: 回顾: 之前的程序中我们已经知道了 ,当数据改变的时候,可以使用通知的方法来来告知其他的模块这样便可以实现多个界面的通

    2024年02月04日
    浏览(42)
  • 第六章:自建MVVM模式的简易项目框架

    前面的几章为我们筑好了MVVM的基础,在这一章中我们将自己搭建一个MVVM模式下的简易项目框架。 MVVM是一种模式,主要目的是降低界面和业务逻辑的耦合。 MVVM是Model-View-ViewModel(模型-视图-视图模型)的简写。是WPF开发过程中必不可少的一种开发模式,MVVM基本结构如下图所

    2023年04月26日
    浏览(72)
  • WPF MvvM框架(MvvMLight,Microsoft Toolkit Mvvm,CommunityToolkit.Mvvm;鼠标,键盘,手写等事件绑定如:抬起按下事件)

    目录 1.MvvMLight(已废弃) 2. Microsoft Toolkit Mvvm(已废弃)  3.CommunityToolkit.Mvvm框架 4.Mvvm中的事件绑定 4.1 DataGrid表中按钮点击事件 4.2 绑定 鼠标事件,键盘事件,手写笔事件,多点触控事件 5.和PLC设备建立联系(联调)    本文中,继承接口,同步数据方法,command用法均一致; 1.继

    2024年02月04日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包