手机网站建设渠道,成都建设网站报价,网站最上面标题怎么改,idzoom室内设计师网ReactiveUI MVVM框架#xff08;1#xff09;-Collections
ReactiveUI使用动态数据#xff08;DynamicData#xff09;用于集合的操作。
当对动态数据集合进行更改时#xff0c;会产生更改通知#xff0c;通知表示为ChangeSet#xff0c;里面包含了更改信息#xff0…ReactiveUI MVVM框架1-Collections
ReactiveUI使用动态数据DynamicData用于集合的操作。
当对动态数据集合进行更改时会产生更改通知通知表示为ChangeSet里面包含了更改信息多个更改通知为IObservableChangeSet。动态数据提供了两种特定的集合分别是SourceCacheTObject, TKey和SourceListT。第一个为带key的字典式也就是不能重复第二个为集合式。如何要将这两种集合转换为IObservableChangeSet可以使用Connect方法。
需要注意的是这跟WPF中常用的ObservableCollectionT的实现方式是不同的。
简单使用
从wpf中常用的ObservableCollectionT得到IObservableChangeSet。
// myList is ObservableCollectionT
// myDerivedList is IObservableListT
var myDerivedList myList.ToObservableChangeSet().Filter(t t.Status Something).AsObservableList();// myList is ObservableCollectionT
// myDerivedCache is IObservableCacheT, TKey
var myDerivedCache myList.ToObservableChangeSet(t t.Id).Filter(t t.Status Something).AsObservableCache();以上两种方式是线程不安全的加入myList绑定到了View上那么在View上也可能对myList进行更改。推荐的方法是先创建一个数据源。
var myList new SourceListT()
var disposable myList.Connect() // 获得IObservableChangeSet.\\some other operation这种方法的好处是可以在后台线程上进行维护。比如
//ReadOnlyObservableCollection可以多线程操作
ReadOnlyObservableCollectionT bindingData;
var disposable mySource.Connect() // make the source an observable change set.Sort(SortExpressionComparerT.Ascending(t t.DateTime)).ObserveOn(RxApp.MainThreadScheduler) // mySource 会在其他线程上更新.Bind(out bindingData).Subscribe(); ReactiveUI使用动态数据
开发时会遇到可变集合和不可变集合当对不可变集合进行处理时简单情况下可以使用ObservableAsPropertyHelperT它包含一个ObservableT。每次给集合赋予新的集合时会触发通知事件。
而对于可变集合往往采用动态数据的方式。
案例
public class Service
{//定义一个数据集private readonly SourceListbool _items new SourceListbool();//暴露给外面public IObservableIChangeSetbool Connect() _items.Connect();public Service(){ _items.Add(true);_items.RemoveAt(0);_items.Add(false);}
}ReadOnlyObservableCollection
动态数据往往使用ReadOnlyObservableCollectionT之类的类型对外公开而不是它本身的类型。IObservableIChangeSetT 和 IObservableIChangeSetTObject, TKey是可以观测类型IObservableIChangeSetT中含有集合更改的内容第一次使用ToObservableChangeSet()时会发出集合的当前状态。SourceList和SourceCache是可以使用多线程进行创建IObservableIChangeSetT等通常SourceList和SourceCache应该定义为Private而是通过Connect方法暴露给View。
public class ViewModel : ReactiveObject
{private readonly ReadOnlyObservableCollectionbool _items;public ReadOnlyObservableCollectionbool 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
ObservableCollectionExtendedT是一个单线程集合如果要同步VM中的两个集合可以将其中一个声明为ObservableCollectionExtendedT另一个声明为ReadOnlyObservableCollectionT然后使用.ToObservableChangeSet()方法将其转换为IObservableIChangeSetT。
public class SynchronizedCollectionsViewModel : ReactiveObject
{private readonly ReadOnlyObservableCollectionbool _derived;public ReadOnlyObservableCollectionbool Derived _derived;public ObservableCollectionExtendedbool Source { get; }public SynchronizedCollectionsViewModel(){Source new ObservableCollectionExtendedbool();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 是 ObservableCollectionT
// T inherits 继承自 ReactiveObject
// databasesValid 则是 IObservablebool
var databasesValid collectionOfReactiveObjects.ToObservableChangeSet().AutoRefresh(model model.IsValid) // 订阅IsValid属性的更改.ToCollection() // 获取新项目集合.Select(x x.All(y y.IsValid)); // 验证是否满足条件.// 将IObservablebool 转为视图模型
// _databasesValid 是ObservableAsPropertyHelperbool 类型
_databasesValid databasesValid.ToProperty(this, x x.DatabasesValid);ReactiveList转为动态数据
如果使用的是ReactiveListT并且仅从UI线程添加/删除则使用ObservableCollectionExtendedT。