MVVM基视图模型类
本文关键字:模型 视图 MVVM | 更新日期: 2023-09-27 18:01:18
我正在创建一个基本视图模型类。ViewModelBase是一个抽象类,我想定义我希望所有其他派生视图模型实现的属性。
属性之一是ObservableCollection:
public abstract ObservableCollection<???> Items { get; set; }
派生自这个基类的类将有不同类型的Items定义(ObservableCollection<Person>
, ObservableCollection<Car>
)。
如果我在ViewModelBase中将ObservableCollection类型设置为object
,则需要我在派生类中进行许多不同的类型转换以使其工作。
这是正确的方法吗?
我不太确定您为什么要使它如此泛型,但如果您这样做,我建议您使抽象基类也泛型:
public abstract class ViewModelBase<T>
{
public abstract ObservableCollection<T> Items { get; set; }
}
我希望你也确保你的ViewModelBase实现INotifyPropertyChanged.
public abstract ObservableCollection<TYPE> Items { get; set; }
可以用多种方式定义TYPE,包括在使用/继承基类或接口时。
如果你正在为应用程序中的所有视图模型创建一个基本视图模型,那么每个单独的将不太可能包含一个可观察集合。
您可以考虑使用组合而不是继承(或者更可能的是,以及继承)来为视图模型添加公共功能。
例如:// Base for ALL view models implements necessary interfaces.
public abstract class BaseViewModel : INotifyPropertyChanged, IDisposable
{
// Functionality useful to ALL view models
public string DisplayName { get; }
// etc.
...
}
// Generic collection view model implementing functionality required by
// all collection view models.
public abstract class CollectionViewModel<T> : BaseViewModel
{
public abstract ObservableCollection<T> Items { get; set; }
}
// Specific collection view model using generic one through composition
public class PersonCollectionViewModel : BaseViewModel
{
public CollectionViewModel<Person> PersonCollection { get; }
// other functionality not included in all collection view models.
// ...
}
定义一些{Entity}类,可以作为Car和Person的基类:你将得到你想要的+强类型
你想让你的基类成为泛型
然后你可以有一个像这样的定义
public abstract class ViewModelBase<T>
{
public abstract ObservableCollection<T> Items { get; set; }
}
如果你想要一个视图模型列表,那么我建议创建一个非泛型基类,泛型基类继承,并有一个列表
public abstract class NonGenericBaseViewModel
{
ObservableCollection<object> ItemsAsObjects{get;set;}
}
public abstract class ViewModelBase<T> : NonGenericBaseViewModel
{
public ObservableCollection<T> Items { get; set; }
}
那么你可以有一个
ObservableCollection<NonGenericBaseViewModel>
如果你想