You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Forms Prism中DynamicData分组后ReadOnlyObservableCollection未填充问题

问题分析与解决方案

1. 修复ViewModel数据属性的关联绑定

你的GetUser属性未与DynamicData填充的_getUsers字段关联,UI无法感知数据变化。修改ViewModel的属性定义:

private SourceCache<User, string> _sourceCache = new SourceCache<User, string>(x => x.Id);
private ReadOnlyObservableCollection<ObservableGroupedCollection<string, User, string>> _getUsers;
// 让GetUser直接关联_getUsers字段,自动触发属性通知
public ReadOnlyObservableCollection<ObservableGroupedCollection<string, User, string>> GetUser 
{ 
    get => _getUsers; 
    private set => SetProperty(ref _getUsers, value); 
}

在完成DynamicData的Bind操作后,手动触发GetUser的属性更新通知:

_cleanUp = _sourceCache.Connect()
           .Filter(genderPredicate)
           .Group(x => x.Race)
           .Transform(g => new ObservableGroupedCollection<string, User, string>(g, genderPredicate, sortPredicate))
           .Bind(out _getUsers)
           .DisposeMany()
           .Subscribe();

// 通知UI数据已更新
OnPropertyChanged(nameof(GetUser));

2. 合并多个过滤条件

当前仅应用了性别过滤,未整合搜索和状态过滤逻辑,导致过滤不完整。使用CombineLatest合并所有过滤条件:

// 合并性别、搜索、状态三个过滤条件
var combinedFilter = Observable.CombineLatest(genderPredicate, filterPredicate, statusPredicate,
    (genderFilter, searchFilter, statusFilter) => 
        user => genderFilter(user) && searchFilter(user) && statusFilter(user));

// 替换原有的Filter,使用合并后的条件
_cleanUp = _sourceCache.Connect()
           .Filter(combinedFilter)
           .Group(x => x.Race)
           .Transform(g => new ObservableGroupedCollection<string, User, string>(g, combinedFilter, sortPredicate))
           .Bind(out _getUsers)
           .DisposeMany()
           .Subscribe();

3. 修正分组集合的内部调度器

在ObservableGroupedCollection的构造函数中,将调度器替换为Xamarin.Forms主线程调度器,确保UI更新在正确线程执行:

var dataLoader = group.Cache.Connect()
    .Filter(filter)
    .Sort(comparer)
    .ObserveOn(DispatcherScheduler.Current) // 替换为Xamarin.Forms主线程调度器
    .Bind(this)
    .Subscribe();

4. 调整数据加载与连接的顺序

尝试先建立DynamicData的连接,再添加数据到SourceCache,确保数据流能被正确捕获:

// 先建立连接管道
_cleanUp = _sourceCache.Connect()
           .Filter(combinedFilter)
           .Group(x => x.Race)
           .Transform(g => new ObservableGroupedCollection<string, User, string>(g, combinedFilter, sortPredicate))
           .Bind(out _getUsers)
           .DisposeMany()
           .Subscribe();

// 再添加数据到源缓存
var users = await _apiService.GetUsers();
_sourceCache.AddOrUpdate(users);

5. 正确管理Disposable资源

确保_cleanUp在ViewModel销毁时被释放,避免内存泄漏:

private IDisposable _cleanUp;

// 在Prism ViewModel中重写OnDestroy方法
public override void OnDestroy()
{
    _cleanUp?.Dispose();
    base.OnDestroy();
}

内容的提问来源于stack exchange,提问作者helper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:10:39