使用 XAML 时,无法使用 XAML 代码中的泛型参数实例化视图模型。
要解决这个问题,您需要利用遗产,这是一个例子:
public abstract class ViewModel<T>
Usage:
public class MovieViewModel : ViewModel<Movie>
...
public class GenreViewModel : ViewModel<Genre>
为每个模型创建一个新类seems有点愚蠢,但这根本不是事实。通过假设每个视图模型包含一个模型,您几乎已经做好了在所有视图模型中遵循这一模式的准备,作为您的基本视图模型enforces这个约束。
我个人使用的模式是ViewModel<T>
基类,其中T
是模型。
将逻辑与基本视图模型分开当然是一个好主意。每个模型的视图模型实际上是一个非常好的实现模式。
还有另一种方法可以实现您所追求的目标,这只是从视图模型库中删除泛型,请考虑以下示例:
public class ViewModel
{
public object Model { get; protected set; }
}
现在,如果您填充Model
让我们说一个Movie
,那么 XAML 会将其视为Movie
,而不是一个object
。现在,就您的 XAML 方面而言,这非常漂亮,但是,当您开始在C#,那么您将遇到各种各样的问题,因为您必须将对象转换为您正在使用的任何类型。所以我根本不会推荐这个。
解决这个问题的另一种方法是设置DataContext
在代码隐藏中,如果你打算这样做,那么,现在只有上帝可以拯救你。 MVVM 设计模式的主要思想是视图逻辑和业务层(视图模型)的分离,一旦视图开始实例化视图模型,那么这种良好的分离就会消失。
现在说来,没有什么可以阻止你这样做,我以前已经说过很多次了。 MVVM是一种设计模式,不是法律,如果你想设置DataContext
在代码隐藏中,那么很公平,但是重要的是您要意识到其中的含义。