在避免大条件的情况下选择合适的ViewModel

时间:2012-02-21 21:46:23

标签: wpf mvvm

我正在编写WPF应用程序,同时主要遵循MVVM设计模式。该应用程序具有分成不同类别的各种教育模块,以由用户完成。模块组织成分层菜单。我的ViewModel有一个名为MenuPageViewModel的类,它公开了呈现MenuNode所需的信息。当然,菜单树中的终端元素具有我想要向用户显示的内容。该内容可以是许多不同类型的模块之一。目前,当用户在菜单中选择一个模块时,我无法看到任何方法使用大条件块来确定我想要返回的ViewModel类型,以便根据MenuItem的Content属性的类型进行显示。例如......

if (CurrentlySelectedMenuItem.Content is Lesson)
                return new LessonViewModel(CurrentlySelectedMenuItem.Content as Lesson);
if (CurrentlySelectedMenuItem.Content is SkillsCheck)
                return new SkillsCheckViewModel(CurrentlySelectedMenuItem.Content as SkillsCheck);

有人能给我一个更优雅和可维护方法的暗示吗?现在,如果我添加一个新的模块类型,我必须记住更新这个条件块,这只会让我感到烦恼。

感谢。

1 个答案:

答案 0 :(得分:0)

如果您使用的是Unity / Prism,那么使用容器来解析对象将是我的第一选择。

_container.Resolve(Type.GetType(strObjectType)) as BaseViewModel;

其中strObjectType是一个字符串,其中包含您要创建的类的类型(例如“LessionViewModel”)

如果您不使用Unity,那么反射就可以了

Activator.CreateInstance(strObjectType) as BaseViewModel;

使用这两种解决方案,您需要在menuItem上使用类类型的字符串。

第三个选择是拥有一个工厂,但它可能最终会在其中出现条件情况,或者包含我刚刚列出的代码。