public static BlockViewModel FromModel(SequencerViewModel sequencer, Model.Block model)
        {
            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

            BlockViewModel vm;

            if (!s_viewModelCache.TryGetValue(model, out vm))
            {
                if (model is Model.ColorBlock)
                {
                    vm = new ColorBlockViewModel(sequencer, (Model.ColorBlock)model);
                }
                else if (model is Model.RampBlock)
                {
                    vm = new RampBlockViewModel(sequencer, (Model.RampBlock)model);
                }
                else if (model is Model.LoopBlock)
                {
                    vm = new LoopBlockViewModel(sequencer, (Model.LoopBlock)model);
                }
                //else if (model is Model.GroupBlock)
                //    vm = new GroupBlockViewModel(sequencer, (Model.GroupBlock)model);

                else
                {
                    throw new NotImplementedException("unknown block type: " + model.GetType().Name);
                }

                s_viewModelCache[model] = vm;
            }

            return(vm);
        }