使用 MVVM,如何在修改集合时通知其他属性和命令

Using MVVM, how to notify other properties and commands when a collection was modified

在一个用C#和Xamarin Forms写的程序中(不过这道题更多是基于MVVM),我有一个ObservableCollection of Items:

        ObserbableCollection<Item> Items { get; set; }

当此集合发生变化时(添加或删除项目 to/from 集合),我需要通知其他属性和命令,因为它们都绑定到 XAML 屏幕上的控件(主要是按钮和标签)。

我找到的唯一解决方案是这样的:

        Items.CollectionChanged += (sender, args) =>
        {
            ((Command)OnHoldCommand).ChangeCanExecute();
            ((Command)CancelSaleCommand).ChangeCanExecute();
            ((Command)ValidateTakeAwayCommand).ChangeCanExecute();
            ((Command)ValidateEatInCommand).ChangeCanExecute();
            RaisePropertyChanged(() => TotalItems);
            RaisePropertyChanged(() => TotalAmount);
        };

您认为还有其他解决方案吗?也许使用 Fody.PropertyChanged?

我在 Xamarin Forms 之上使用 FreshMvvm 作为 Mvvm 框架。

您的 ViewModel 通常实现 INotifyPropertyChanged 接口。如果是,那么您可以订阅 PropertyChanged 事件并监听集合的更改,就像视图所做的那样。在事件处理程序中,如果需要,可以通知其他属性。

另一种更直接的方法是,当您的 ViewModel 控制了 inserts/changes 时,您可以直接通知其他属性,例如插入新项目(调用 NotifyPropertyChanged() 方法)。