我正在为学校项目设计一个(有点)简单的测验应用程序以适应MVVM。
它有两个视图 - 一个用于实际测验部分,一个用于结果等。
要在这些视图之间导航,我使用的是当前为空的BaseVeiwModel类(仅继承自INotifyPropertyChanged的ObservableObject类实现)。
这是我的两个视图模型的基类,其中我将其实例设置为当前视图,允许我在第一个视图模型中使用方法在它们之间切换。
我想问一个基本的viewmodel类是否为空是不好的做法,如果我应该怎么做?我确实考虑过只使用一个ObservableObject实例,因为它们都从OBservableObject继承 - 但我认为它看起来不那么清晰和杂乱 - 因为我的模型也继承了ObservableObject。
编辑:
因此,我的BaseViewModel目前已在我的第一个VeiwModel
中实例化private BaseVeiwModel _currentVeiw;
public BaseVeiwModel CurrentVeiw
{
get { return _currentVeiw; }
set { OnPropertyChanged(ref _currentVeiw, value); }
}
//in the constructor:
CurrentVeiw = this;
然后我有一个方法(当前用作按钮的命令但将在QuestionViewModel类中调用)将视图更改为我的第二个:
private void ChangeView(object blank)
{
CurrentVeiw = new FinishedVeiwModel();
Console.WriteLine("Button Clicked!");
Console.WriteLine(CurrentVeiw);
}
My Base类只是:
public class BaseVeiwModel :ObservableObject
{
//Completely empty
}
答案 0 :(得分:5)
不,这不是一个坏习惯。在基类中实现示例INotifyPropertyChanged
是一个好主意,否则您必须在每个视图模型中执行此操作。
我建议您制作基类abstract
。那么你就无法创建这个基类的实例。
public abstract class BaseViewModel
abstract
修饰符表示正在修改的内容具有 实施缺失或不完整。 abstract修饰符可以是 用于类,方法,属性,索引器和事件。使用 类声明中的abstract
修饰符,表示类是 仅旨在成为其他类的基类。成员标记为 抽象,或包含在抽象类中,必须通过实现 派生自抽象类的类。
答案 1 :(得分:1)
为所有视图模型建立公共基类是一种非常常见的方法。
所有MVVM framworks都在那里,例如MvvmLight,Prism,Caliburn.Micro和RectiveUI包含一个基类,您的自定义视图模型类应该从该基类继承。
所以这当然不是一个坏习惯。您还可以提供自己的基类,该基类继承自库基类。
如果基类真的是空的,即没有INotifyPropertyChanged
实现或任何代码,你可能会考虑使用一个接口,但除此之外你的方法没有任何问题。