2017-09-05 75 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