使用 MVVM 中的委托更新可观察集合

本文关键字:更新 观察 集合 MVVM 使用 | 更新日期: 2023-09-27 18:36:45

>我有三个视图模型:MainViewModel,PreferencesViewModel和ColorControllerViewModel - 后两个是MainViewModel的属性。

ColorControllerViewModel用于"ColorSelector"视图,可以在其中创建和删除各种颜色。它包含一个 ColorViewModel 的可观察集合,该集合具有详细说明颜色的属性,以及一个 bool 属性,用于确定它是否应该显示在首选项选项卡(DisplayOnPreferences)上。

PreferencesViewModel 用于"首选项"视图,其中包含一个颜色组合框 - 这由 ColorViewModel 的 ObservableCollection 表示,并且只应显示 DisplayOnPreferences == true 的那些 ColorViewModels。

我的问题是,最简单的方法是什么?目前,我正在使用一个名为 UpdateList() 的操作委托,它将更新的列表从 ColorControllerViewModel 传递到 MainViewModel,从而更新 PreferencesViewModel。我真的不喜欢这个,感觉有更好的方法。

是否应该在 MainViewModel 上有一个由任一实例更新/访问的 ColorViewModel 的可观察集合?

以下是课程:

public class MainViewModel : ViewModel
{
      private ColourMappingControllerViewModel _colourMappingControllerViewModel;
      private PreferencesControllerViewModel _preferencesTabViewModel;

      public MainViewModel()
      {
        // Initialise the database Handler
        dbHandler = DatabaseHandler.DbHandlerInstance;
        _colourMappingControllerViewModel = new ColourMappingControllerViewModel(dbHandler.GetColourMappingsList(), UpdateColourList);
        _preferencesTabViewModel = new PreferencesControllerViewModel(dbHandler.GetPreferences, ColourMappingList)    
       }
      public ObservableCollection<ColourMappingViewModel> ColourMappingList
      {
          get { return ColourMappingControllerViewModel.ColourMappingList; }        
      }

      public void UpdateColourList(ObservableCollection<ColourMappingViewModel> colourList)
      {
          PreferencesTabViewModel.UpdateColourList(colourList);
      }       
}
public class ColourMappingControllerViewModel : ViewModel
{
    public ColourMappingControllerViewModel(IEnumerable<ColourMapping> colourMappingsList,  Action<ObservableCollection<ColourMappingViewModel>> updateColourListAction)
    {
        InitialiseCommands();
        ColourMappingList = new ObservableCollection<IColourMappingViewModel>(InitialiseColourMappingsList(colourMappingsList));
    }
    public ICommand AddColourMappingCommand { get; set; }
    private void InitialiseCommands()
    {
        AddColourMappingCommand = new DelegatingCommand(AddColourMapping);
    }
    private void AddColourMapping() // Attached to Command on View
    {
        var newColourMapping = new ColourMappingViewModel(
            new ColourMapping());
        ColourMappingList.Add(newColourMapping);
        ColourMappingsCollectionView.MoveCurrentToLast();
        UpdateColourMappingList();
    }

    private void UpdateColourMappingList()
    {
        UpdateColourListAction.Invoke(ColourMappingList);
    }
}

public PreferencesControllerViewModel : ViewModel
{
    public PreferencesControllerViewModel(object preferenceInfo, ObservableCollection<ColourMappingViewModel> colourMappingsList)
    {
        var pciTrendBlocks = pciBlocks;
        ColourMappingsList = colourMappingsList;            
    }
    public void UpdateColourList(ObservableCollection<ColourMappingViewModel> colourList)
    {
        ColourMappingsList = colourList;
    }    
}

我知道 ObservableCollection 类被滥用了 - 它可能不需要在首选项上,因为它只会在 ColorMappingController 中更新。

使用 MVVM 中的委托更新可观察集合

我同意您需要一个在视图之间共享的ObservableCollection。这实际上成为 MVVM 中的"模型"。

您可能还希望通过具有可传递给首选项 VM 等的 ReadOnlyObservableCollection 来强制实施不同的访问语义。这确保了只有ColourControllerViewModel(获取基础ObservableCollection)才能实际更改集合。

在我的应用程序中,我倾向于有一个单独的数据层,但是是的,现在最简单的方法是将它们添加到MainViewModel

另一种方法是ColourControllerViewModel拥有集合的东西(并将其公开为ReadOnlyObservableCollection),并且MainViewModel将集合传递到需要它的任何其他 VM 中。