gpt4 book ai didi

mvvm - 在datagrid中添加或删除项目不会触发WhenAnyPropertyChanged

转载 作者:行者123 更新时间:2023-12-03 11:01:57 25 4
gpt4 key购买 nike

我正在使用Reactui的动态数据,

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

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

在我的 View 模型中,我有这样的东西
   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()将根据我删除的项目数增加或减少

在我的ViewModel中
  OKCmd = ReactiveCommand.Create(() =>
{
//// _myList.Connect()
////.Subscribe(t =>
//// {
//// ;

//// }
//// );

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

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

谢谢。

最佳答案

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

  • 如果要添加/删除事件,则需要_propList.Connect().Subscribe(changes => ...)。这些是集合更改,您将收到所有集合更改事件,包括初始加载,但没有内联更改。
  • 默认情况下,不会插入任何属性更改。这是因为监视属性更改非常昂贵,并且只能选择加入。同样,WhenAnyPropertyChanged()绝不会对初始加载进行触发。这是因为该项目已经加载,并且在Connect被调用与已更改的可观察属性之间没有任何属性被更改。
  • 从2开始,从基础源中删除项目后,您将永远不会收到更改的属性。这是因为当删除项目时,将处理任何内联订阅。否则会发生内存泄漏。
  • 监视内联更改的另一个选项是使用“MergeMany”,它允许您对特定项目制作任何可观察值,并且在您的情况下,您可以创建一个可观察值以返回初始值以及后续更改。

  • 使用标准rx可以在单个可观察对象中监听集合更改和内联更改,您必须自己编写。例如

    var myCollectionChanges = _propList.Connect();
    var myPropertyChanges = _propList.Connect().WhenAnyPropertyChanged();

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

    在此示例中,我使用了 Select(_ => Unit.Default)启用合并操作符,因为它需要相同的签名。但是,返回的签名取决于您,关键是签名必须匹配。

    关于mvvm - 在datagrid中添加或删除项目不会触发WhenAnyPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57460194/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com