【发布时间】:2015-01-07 10:41:37
【问题描述】:
我有三个 ViewModel:MainViewModel、PreferencesViewModel 和 ColourControllerViewModel - 后两个是 MainViewModel 的属性。
ColourControllerViewModel 用于“ColourSelector”视图,可以在其中创建和删除各种颜色。它包含一个 ColourViewModel 的 ObservableCollection,它有一个详细说明颜色的属性和一个布尔属性,用于确定它是否应该显示在首选项选项卡 (DisplayOnPreferences) 上。
PreferencesViewModel 用于“Preferences”视图,其中包含一个颜色组合框 - 这由 ColourViewModel 的 ObservableCollection 表示,并且仅应显示 DisplayOnPreferences == true 的那些 ColourViewModel。
我的问题是,最简单的方法是什么?目前,我正在使用一个名为 UpdateList() 的 Action 委托,它将更新后的列表从 ColourControllerViewModel 传递到 MainViewModel,而 MainViewModel 又会更新 PreferencesViewModel。不过我不是很喜欢这样,感觉有更好的方法。
是否应该在 MainViewModel 上存在由任一实例更新/访问的 ColourViewModel 的单个 ObservableCollection?
以下是课程:
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 类被滥用了——它可能在 Preferences 上没有必要,因为它只会在 ColourMappingController 中更新。
【问题讨论】:
标签: c# wpf mvvm delegates observablecollection