我正在创建一个基本视图模型类。 ViewModelBase是一个抽象类,我想定义我希望所有其他派生视图模型实现的属性。
其中一个属性是ObservableCollection:
public abstract ObservableCollection<???> Items { get; set; }
从此基类派生的类将定义不同类型的项目(ObservableCollection<Person>
,ObservableCollection<Car>
)。
如果我在ViewModelBase中将ObservableCollection类型设置为object
,则需要在派生类中进行大量不同的转换才能使其工作。
这是正确的方法吗?
答案 0 :(得分:11)
我不太确定你为什么要这么通用,但如果你这样做,我建议你也把抽象基类做成通用的:
public abstract class ViewModelBase<T>
{
public abstract ObservableCollection<T> Items { get; set; }
}
我希望你也确保你的ViewModelBase实现了INotifyPropertyChanged。
答案 1 :(得分:2)
public abstract ObservableCollection<TYPE> Items { get; set; }
您可以通过多种方式定义TYPE,包括使用/继承基类或接口时。
答案 2 :(得分:2)
如果要为应用程序中的 all 视图模型创建基本视图模型,那么每个单个视图模型都不可能拥有可观察的集合。< / p>
您可以考虑使用合成而不是继承(或更可能的,以及继承)来为视图模型添加常用功能。
例如:
// 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.
// ...
}
答案 3 :(得分:0)
定义一些类{Entity},它可以是Car和Person的基类:你会得到你想要的东西+强类型。
答案 4 :(得分:0)
您希望使您的基类通用
然后你可以有这样的定义
public abstract class ViewModelBase<T>
{
public abstract ObservableCollection<T> Items { get; set; }
}
如果你想要一个viewmodels列表,那么我建议你创建一个非通用的基类,通用的基类继承并有一个列表
public abstract class NonGenericBaseViewModel
{
ObservableCollection<object> ItemsAsObjects{get;set;}
}
public abstract class ViewModelBase<T> : NonGenericBaseViewModel
{
public ObservableCollection<T> Items { get; set; }
}
然后你可以有一个
ObservableCollection<NonGenericBaseViewModel>
如果你想要