我有三个ViewModel:MainViewModel,PreferencesViewModel和ColourControllerViewModel - 后两个是MainViewModel的属性。
ColourControllerViewModel用于' ColourSelector'视图,可以创建和删除各种颜色。它包含一个ColourViewModel的ObservableCollection,它具有详细描述颜色的属性,以及一个bool属性,用于确定它是否应显示在首选项选项卡(DisplayOnPreferences)上。
PreferencesViewModel用于'偏好设置'视图,其中包含一个颜色组合框 - 这由ColourViewModel的ObservableCollection表示,并且只显示那些应显示DisplayOnPreferences == true的ColourViewModels。
我的问题是,最简单的方法是什么?目前,我正在使用一个名为UpdateList()的Action委托,它将更新的列表从ColourControllerViewModel传递给MainViewModel,MainViewModel又更新了PreferencesViewModel。我不是很喜欢这个,感觉就像是更好的方式。
MainViewModel上是否存在一个由任一实例更新/访问的ColourViewModel的ObservableColl?
以下是课程:
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类被滥用 - 它可能在首选项上没有必要,因为它只会在ColourMappingController中更新。
答案 0 :(得分:0)
我同意您需要在视图之间共享一个ObservableCollection
。这有效地成为MVVM中的“模型”。
您可能还希望通过将ReadOnlyObservableCollection传递给您的首选项VM等来强制执行不同的访问语义。这样可以确保只有ColourControllerViewModel
(获取基础ObservableCollection
)实际上可以改变收藏。
在我的应用中,我倾向于有一个单独的数据层,但是,现在最简单的方法是将它们添加到MainViewModel
。
另一种方法是让ColourControllerViewModel
成为拥有该集合的东西(并将其公开为ReadOnlyObservableCollection
),让你MainViewModel
将该集合传递给任何其他虚拟机需要它。