为派生的Model类创建不同的ViewModel对象

时间:2015-07-29 01:37:11

标签: c# .net mvvm

在C#中实现MVVM模式:如果Model对象的确切类型仅在运行时已知,我如何创建ViewModel实例?

我有一个抽象的ModelBase类和一个抽象的ViewModelBase类以及几个派生类,例如FirstModel : ModelBaseSecondModel : ModelBase等等,以及FirstViewModel : ViewModelBaseSecondViewModel : ViewModelBase等。

现在我想实现一个为给定模型对象创建适当视图模型的函数。这些方面的东西:

ViewModelBase CreateViewModel(ModelBase someObject)
{
    return new ViewModelBase(someObject);
}

上述代码当然不起作用,因为ViewModelBase是抽象的。我宁愿创建一个新的FirstViewModelSecondViewModel等等,具体取决于someObject的类型,只有在运行时才知道。

我将如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

static Dictionary<Type, Type> TypeMap = new Dictionary<Type, Type>
{
    {typeof(ModelA), typeof(ViewModelA)},
    {typeof(ModelB), typeof(ViewModelB)},
    {typeof(ModelC), typeof(ViewModelC)}
};

static ViewModelBase CreateViewModel(ModelBase someObject)
{
    return Activator.CreateInstance(TypeMap[someObject.GetType()]);
}

答案 1 :(得分:1)

仅仅因为类型安全而允许任何模型与视图模型耦合是不明智的。例如,如果您的视图模型需要Genre,而是在运行时获得public class ViewModel<TModel> : ViewModelBase where TModel : ModelBase { public TModel Model { get; protected set; } public ViewModel(TModel model) { Model = model; } ... } ,那么视图模型如何使用此模型进行操作?

也许我完全错过了您的要求,但您可以使用通用视图模型库:

public class MovieViewModel : ViewModel<Movie>
{
    ...
}

public class GenreViewModel : ViewModel<Genre>
{
    ...
}

然后,您可以根据映射创建视图模型。例如:

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb