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

如何基于DynamicData的SourceList实现ReactiveCommand触发删除项功能?

基于DynamicData SourceList实现项移除逻辑

当然可以实现,核心思路是监听集合中每个项的RemoveCommand执行事件,而非监听属性变更(旧代码的ObserveProperty其实是监听属性引用变化,而非命令执行,这是逻辑误区)。以下是具体实现方案:

实现步骤

  1. 维护字典跟踪每个项的命令订阅,避免内存泄漏
  2. 通过SourceList的变更集,对新增项订阅RemoveCommand,对移除项取消订阅
  3. 命令触发时从SourceList中移除对应项

代码示例

// 你的SourceList实例
private readonly SourceList<YourItemViewModel> _sourceList = new SourceList<YourItemViewModel>();
// 跟踪每个项的命令订阅,用于资源清理
private readonly Dictionary<YourItemViewModel, IDisposable> _itemCommandSubscriptions = new Dictionary<YourItemViewModel, IDisposable>();

// 初始化时设置监听逻辑
public void InitializeCollectionHandling()
{
    _sourceList.Connect()
        .Subscribe(changeSet =>
        {
            // 处理新增项:订阅RemoveCommand,触发时移除自身
            foreach (var item in changeSet.Added)
            {
                var commandSubscription = item.RemoveCommand.Subscribe(() => _sourceList.Remove(item));
                _itemCommandSubscriptions[item] = commandSubscription;
            }

            // 处理移除项:取消订阅,释放资源
            foreach (var item in changeSet.Removed)
            {
                if (_itemCommandSubscriptions.TryGetValue(item, out var subscription))
                {
                    subscription.Dispose();
                    _itemCommandSubscriptions.Remove(item);
                }
            }
        });
}

// 在组件销毁时清理所有资源
public void Cleanup()
{
    foreach (var subscription in _itemCommandSubscriptions.Values)
    {
        subscription.Dispose();
    }
    _itemCommandSubscriptions.Clear();
    _sourceList.Dispose();
}

关键说明

  • 旧代码的ObserveProperty(vm => vm.RemoveCommand)监听的是RemoveCommand属性的引用变更,但我们真正需要的是命令被触发时执行移除操作,因此直接订阅RemoveCommand的执行事件才是正确逻辑。
  • 通过DynamicData的变更集(ChangeSet),可以精准捕获集合的新增/移除操作,确保每个项的命令订阅都能被正确管理,避免内存泄漏。
  • 若你的RemoveCommand是ReactiveCommand,Subscribe方法会在命令执行时触发回调,此时调用_sourceList.Remove(item)即可完成项的移除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:05:32