Basically, I have a set of views and view models in my project. There is a one-to-one mapping of views and view models, so each view requires a particular view model. I'd like to instantiate a series of views given a collection of view models.
Here's what I've come up with:
public class OverlayBundle : DrawingVisual
{
private static readonly Dictionary<Type, Func<IOverlayViewModel, DrawingVisual>> _overlayCreators =
new Dictionary<Type, Func<IOverlayViewModel, DrawingVisual>>
{
{ typeof(ImageOverlayViewModel), x => new ImageOverlay((ImageOverlayViewModel)x) },
{ typeof(ValuesOverlayViewModel), x => new ValuesOverlay((ValuesOverlayViewModel)x) },
{ typeof(NoGoAreasOverlayViewModel), x => new NoGoAreasOverlay((NoGoAreasOverlayViewModel)x) },
};
private readonly OverlayBundleViewModel _viewModel;
private IEnumerable<Visual> _overlays;
public OverlayBundle(OverlayBundleViewModel viewModel)
{
_viewModel = viewModel;
GenerateChildren();
}
private void GenerateChildren()
{
_overlays = _viewModel.GetAllOverlayViewModels().Select(GetOverlay);
foreach (var overlay in _overlays)
Children.Add(overlay);
}
private Visual GetOverlay(IOverlayViewModel viewModel)
{
return _overlayCreators[viewModel.GetType()](viewModel);
}
}
This works. Maybe it's not terrible, but I feel like there must be a better way. Any feedback would be much appreciated.