使用 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 中更新。
我同意您需要一个在视图之间共享的ObservableCollection
。这实际上成为 MVVM 中的"模型"。
您可能还希望通过具有可传递给首选项 VM 等的 ReadOnlyObservableCollection 来强制实施不同的访问语义。这确保了只有ColourControllerViewModel
(获取基础ObservableCollection
)才能实际更改集合。
在我的应用程序中,我倾向于有一个单独的数据层,但是是的,现在最简单的方法是将它们添加到MainViewModel
。
另一种方法是ColourControllerViewModel
拥有集合的东西(并将其公开为ReadOnlyObservableCollection
),并且MainViewModel
将集合传递到需要它的任何其他 VM 中。