【问题标题】:Add or remove item in datagrid does not trigger WhenAnyPropertyChanged在数据网格中添加或删除项目不会触发 WhenAnyPropertyChanged
【发布时间】:2019-08-12 11:18:21
【问题描述】:

我正在使用带有响应式 UI 的动态数据,

`  _propList.Connect()
        .WhenAnyPropertyChanged()
        .Subscribe(t =>
        {
        }`

如果我只是编辑网格中的任何项目,代码将被触发。但是,当我尝试添加或删除项目时,它不会被触发。

在我的视图模型中我有这样的东西

   private SourceList<Decision> _myList { get; set; } = new SourceList<Decision>();
        private readonly IObservableCollection<Decision> _targetCollection = new ObservableCollectionExtended<Decision>();
        public IObservableCollection<Decision> TargetCollection => _targetCollection;

在我看来,我只是

        this.OneWayBind(VM, vm => vm.TargetCollection, v => v.DataGrid1.DataSource);

如果我在网格中删除或添加项目,然后按保存

_myList.Count() 没有改变,但是 _TargetCollection.Count() 将根据我删除的项目数增加或减少

在我的视图模型中

  OKCmd = ReactiveCommand.Create(() =>
        {
        ////    _myList.Connect()
        ////.Subscribe(t =>
        //// {
        ////     ;

        //// }
        //// );

t.Items.count() 它是初始加载项目,但我似乎不知道添加或删除了哪些项目。我是不是错过了什么。

当然,我可以跟踪在 UI 中添加或删除了哪些项目,但我希望我不必这样做。

谢谢。

【问题讨论】:

    标签: mvvm datagrid reactiveui


    【解决方案1】:

    为了帮助我回答您的问题,我需要更好地了解您想要实现的目标,但首先我将解释 DD 的默认行为是什么。

    1. 如果您想添加/删除事件,您需要_propList.Connect().Subscribe(changes =&gt; ...)。这些是集合更改,您将收到所有集合更改事件,包括初始加载,但没有内联更改。
    2. 默认情况下,不会连接任何属性更改。这是因为监视属性更改的成本很高,并且只能选择加入。此外,WhenAnyPropertyChanged() 从不触发初始负载。这是因为该项目已经加载,并且在调用 Connect 和属性更改的 observable 被订阅之间没有任何属性发生变化。
    3. 从 2 开始,当从基础源中删除项目时,您将永远不会收到更改的属性。这是因为当它删除一个项目时,所有内联订阅都会被处理掉。否则会出现内存泄漏。
    4. 监控内联更改的另一个选项是使用“MergeMany”,它允许您在特定项目上制作任何可观察对象,在您的情况下,您可以创建一个可观察对象来返回初始值以及后续更改。

    可以使用标准 rx 在单个 observable 中侦听集合更改和内联更改,您必须自己编写。例如

    var myCollectionChanges = _propList.Connect();
    var myPropertyChanges = _propList.Connect().WhenAnyPropertyChanged();
    
    var allMyChanges = myCollectionChanges.Select(_ => Unit.Default)
                         .Merge(myPropertyChanges.Select(_ => Unit.Default));
    

    在本例中,我使用了Select(_ =&gt; Unit.Default) 来启用合并运算符,因为它需要相同的签名。但是返回什么签名取决于您,关键是签名必须匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-05
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2021-10-03
      相关资源
      最近更新 更多