使用MVVM中的委托更新ObservableCollection?

时间:2015-01-07 10:41:37

标签: c# wpf mvvm delegates observablecollection

我有三个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中更新。

1 个答案:

答案 0 :(得分:0)

我同意您需要在视图之间共享一个ObservableCollection。这有效地成为MVVM中的“模型”。

您可能还希望通过将ReadOnlyObservableCollection传递给您的首选项VM等来强制执行不同的访问语义。这样可以确保只有ColourControllerViewModel(获取基础ObservableCollection)实际上可以改变收藏。

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

另一种方法是让ColourControllerViewModel成为拥有该集合的东西(并将其公开为ReadOnlyObservableCollection),让你MainViewModel将该集合传递给任何其他虚拟机需要它。