第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用 DynamicData 創(chuàng)建派生的 ViewModel 集合,該集合更新現(xiàn)有項(xiàng)目

使用 DynamicData 創(chuàng)建派生的 ViewModel 集合,該集合更新現(xiàn)有項(xiàng)目

C#
白衣非少年 2022-06-19 16:55:18
例如,我有一些指示對(duì)象狀態(tài)的集合的可觀察對(duì)象(我通過(guò) REST API 定期獲取它)。class User{    int Id { get; }    string Name { get; }    string Status { get; }}IObservable<User> source;我想創(chuàng)建一個(gè)DynamicCache對(duì)象并在每次source給我一個(gè)新結(jié)果時(shí)更新它。所以我寫(xiě)道:var models = new SourceCache<User,int>(user => user.Id);models.Connect()      .Transform(u => new UserViewModel() {...})      ...      .Bind(out viewModels)      .Subscribe();source.Subscribe(ul => models.EditDiff(ul, (a, b) => a.Status == b.Status));但是現(xiàn)在每次用戶更改其狀態(tài)時(shí),.Transform(...)方法都會(huì)創(chuàng)建一個(gè) 的新實(shí)例UserViewModel,這不是所需的行為。當(dāng)具有相同 Id 的源項(xiàng)發(fā)生更改而不是每次都創(chuàng)建一個(gè)新項(xiàng)時(shí),我能否以某種方式確定更新現(xiàn)有 ViewModel 屬性(在派生集合中)的規(guī)則?
查看完整描述

1 回答

?
慕容森

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊

答案是您需要?jiǎng)?chuàng)建一個(gè)自定義運(yùn)算符。我在TransformWithInlineUpdate此處發(fā)布了一個(gè)要點(diǎn),您可以將其復(fù)制到您的解決方案中。示例用法是:


var users = new SourceCache<User, int>(user => user.Id);


var transformed =  users.Connect()

    .TransformWithInlineUpdate(u => new UserViewModel(u), (previousViewModel, updatedUser) =>

        {

            previousViewModel.User = updatedUser;

        });

為了答案的完整性,這里是代碼:


    public static IObservable<IChangeSet<TDestination, TKey>> TransformWithInlineUpdate<TObject, TKey, TDestination>(this IObservable<IChangeSet<TObject, TKey>> source,

        Func<TObject, TDestination> transformFactory,

        Action<TDestination, TObject> updateAction = null)

    {

        return source.Scan((ChangeAwareCache<TDestination, TKey>)null, (cache, changes) =>

            {

                //The change aware cache captures a history of all changes so downstream operators can replay the changes

                if (cache == null)

                    cache = new ChangeAwareCache<TDestination, TKey>(changes.Count);


                foreach (var change in changes)

                {

                    switch (change.Reason)

                    {

                        case ChangeReason.Add:

                            cache.AddOrUpdate(transformFactory(change.Current), change.Key);

                            break;

                        case ChangeReason.Update:

                        {

                            if (updateAction == null) continue;


                            var previous = cache.Lookup(change.Key)

                                .ValueOrThrow(()=> new MissingKeyException($"{change.Key} is not found."));

                            //callback when an update has been received

                            updateAction(previous, change.Current);


                            //send a refresh as this will force downstream operators to filter, sort, group etc

                            cache.Refresh(change.Key);

                        }

                            break;

                        case ChangeReason.Remove:

                            cache.Remove(change.Key);

                            break;

                        case ChangeReason.Refresh:

                            cache.Refresh(change.Key);

                            break;

                        case ChangeReason.Moved:

                            //Do nothing !

                            break;

                    }

                }

                return cache;


            }).Select(cache => cache.CaptureChanges()); //invoke capture changes to return the changeset

    }


查看完整回答
反對(duì) 回復(fù) 2022-06-19
  • 1 回答
  • 0 關(guān)注
  • 159 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)