2017-09-05 48 views
0

在用C#编写和Xamarin形式的程序(但这个问题更多的是基于MVVM)如何通知其他属性和命令,我有一个项目一个ObservableCollection:使用MVVM,当集合被修改

 ObserbableCollection<Item> Items { get; set; } 

当这个集合发生变化时(一个项目被添加到集合或从集合中移除),我需要通知其他属性和命令,因为它们都绑定到XAML屏幕上的控件(通常是按钮和标签)。

我发现的唯一的解决办法是这样的:

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

你认为还有另一种解决方案?也许使用Fody.PropertyChanged?

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

+1

告诉我,请你试着完成什么?为什么你需要按钮和标签监听收藏改变? –

+1

@YehorHromadskyi由于屏幕上的某些标签显示了更新项目列表时计算的信息。有些按钮被命令禁用(使用CanExecute功能)。这些CanExecute功能还依赖于项目列表的内容。 – hugoterelle

+1

您当前的方法是我知道的唯一选项,无需创建将依赖对象连接在一起的某种“更改级联”框架。 –

回答

1

您的ViewModel通常实现INotifyPropertyChanged接口。如果确实如此,那么您可以订阅PropertyChanged事件,并收听收藏的更改,如视图所做的那样。在事件处理程序中,如有必要,可以通知其他属性。

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

+0

这就是我所做的,但是在集合的CollectionChanged事件中。如果我理解你的意思,结果代码应该是相同的。 – hugoterelle

+0

@hugorgor - 在您的示例中,您直接订阅“Collection.OnChange”事件,当然这可以完成。当对子视图“ViewModel.INotifyPropertyChanged.PropertyChanged”进行子化时,您会得到通知,每当您的应用程序执行通知时,独立于该集合是否引发事件。差别是微妙的。 – martinstoeckli