Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mvvm ReactiveUI和DynamicDataSourceCache更新问题_Mvvm_Xamarin.forms_Dynamic Data_Reactiveui - Fatal编程技术网

Mvvm ReactiveUI和DynamicDataSourceCache更新问题

Mvvm ReactiveUI和DynamicDataSourceCache更新问题,mvvm,xamarin.forms,dynamic-data,reactiveui,Mvvm,Xamarin.forms,Dynamic Data,Reactiveui,在我的Xamarin表单项目中,我正在使用DynamicATA中的SouceCache跟踪后端的更改。首先,我从后端获取项目列表,填充UI,然后等待更改 问题是,当新的(更新的)对象从后端到达时,我在一个_innerCache集合中找到并更新它,observable不会发出新的值,UI也不会更新 代码被简化了,但它是这样的: _internalSourceCache = new SourceCache<Item, string>(o => o.Id); public IObs

在我的Xamarin表单项目中,我正在使用DynamicATA中的SouceCache跟踪后端的更改。首先,我从后端获取项目列表,填充UI,然后等待更改

问题是,当新的(更新的)对象从后端到达时,我在一个_innerCache集合中找到并更新它,observable不会发出新的值,UI也不会更新

代码被简化了,但它是这样的:

_internalSourceCache = new SourceCache<Item, string>(o => o.Id);

public IObservable<IChangeSet<Item, string>> Connect() => _internalSourceCache.Connect();

private void OnItemUpdated(List<Item> items)
        {
            foreach (var item in items)
            {
                _internalSourceCache.Edit(innerCache =>
                {
                    innerCache.AddOrUpdate(item);
                });
            }
        }
\u internalSourceCache=newsourcecache(o=>o.Id);
public IObservable Connect()=>\u internalSourceCache.Connect();
已更新的私人文件(列表项)
{
foreach(项目中的var项目)
{
_internalSourceCache.Edit(innerCache=>
{
innerCache.AddOrUpdate(项);
});
}
}
在需要进行这些更改的视图模型中:

itemsService
     .Connect()
     .Transform(item=>
           {

               return new ItemCellViewModel(item);
           }, (_, n) => _ = new ItemCellViewModel(n))
     .Sort(SortExpressionComparer<ItemCellViewModel>.Descending(t => t.Status))
     .DisposeMany()
     .ObserveOn(MainThreadScheduler)
     .Bind(out _items)
     .Subscribe();
itemsService
.Connect()
.Transform(项=>
{
返回新的ItemCellViewModel(item);
},(u,n)=>u=新项目CellViewModel(n))
.Sort(SortExpressionComparer.Descending(t=>t.Status))
.DisposeMany()
.ObserveOn(MainThreadScheduler)
.绑定(输出项目)
.Subscribe();

我显然遗漏了一些内容,但我仍然不知道是什么,因此如果您发现问题,请提供帮助:)

没有明显错误,所有这些运算符都是常用的。是否会引发异常?要对此进行测试,您可以添加
Do
语句并调试或写入控制台。例如:

.Do(changes=>Console.WriteLine(changes),ex=>Console.WriteLine(ex))
.Transform(项=>新项CellViewModel(项))
.Do(changes=>Console.WriteLine(changes),ex=>Console.WriteLine(ex))
在每个操作员之前和之后执行此操作将允许您缩小问题范围

此外,但与您的问题完全无关,永远不要更新这样的来源

foreach(项目中的变量项目)
{
_internalSourceCache.Edit(innerCache=>
{
innerCache.AddOrUpdate(项);
});
}
因为它是超低效的。在这种情况下,将为每个项目发出一个新的变更集,并沿链传输。相反,你应该这样做

\u internalSourceCache.Edit(innerCache=>
{
\\这样做只会产生一个变更集
foreach(项目中的var项目)
innerCache.AddOrUpdate(项);
});
或者如果没有适用的逻辑

\u internalSourceCache.AddOrUpdate(项目);

我发现问题出在哪里-转换方法是一些定制的扩展方法,没有按预期执行。当我引用dynamicata Trnasform时,一切都像一个符咒!我真的没有想到F12的转换,但当你不知道该怎么做更多…:)抱歉误报,谢谢

谢谢!我将items update更改为_internalSourceCache.AddOrUpdate(items),并在转换前后添加了日志-奇怪的是,我在转换前后无一例外地输入Do方法,但从未在转换中。。。