2011-07-05 58 views
6

我正在创建基本视图模型类。 ViewModelBase是一个抽象类,我想定义我希望所有其他派生视图模型实现的属性。MVVM基本视图模型类

一个属性是一个ObservableCollection:

public abstract ObservableCollection<???> Items { get; set; } 

从该基类派生将具有不同类型的定义的项目(ObservableCollection<Person>ObservableCollection<Car>)的类。

如果我在ViewModelBase中将ObservableCollection类型设置为object,则需要我在派生类中进行大量不同的转换才能使其工作。

这是正确的做法吗?

回答

11

我不太知道你为什么会想要做起来很普通,但如果你没有,我建议你做的抽象基类的通用,以及:

public abstract class ViewModelBase<T> 
{ 
    public abstract ObservableCollection<T> Items { get; set; } 
} 

我希望你还要确保你的ViewModelBase实现了INotifyPropertyChanged。

+0

感谢。我不相信我完全忘了泛型。我这样做的原因是因为我的很多视图模型除了一些细微的差别外几乎完全相同,所以我想把普通的东西放在基类中。 – Flack

2
public abstract ObservableCollection<TYPE> Items { get; set; } 

您可以通过多种方式定义TYPE,包括从基类或Interface使用/继承时的类型。

0

定义一些可以作为汽车和人的基类的类{实体}:你将得到你想要的东西+强大的输入。

0

你想使你的基类的通用

然后你就可以有这样的

public abstract class ViewModelBase<T> 
{ 
    public abstract ObservableCollection<T> Items { get; set; } 
} 

一个defition如果你想的ViewModels的名单,那么我会建议创建一个非泛型基类的一般一个继承关,并有该

public abstract class NonGenericBaseViewModel 
{ 
    ObservableCollection<object> ItemsAsObjects{get;set;} 
} 

public abstract class ViewModelBase<T> : NonGenericBaseViewModel 
{ 
    public ObservableCollection<T> Items { get; set; } 
} 

列表,那么你可以有一个

ObservableCollection<NonGenericBaseViewModel> 

如果你想

2

如果你正在创建所有视图模型应用程序中的基本视图模式,那么它是不可能的单一个将举行一个观察的集合。

您可以考虑使用组合而不是继承(或更可能,以及继承)来为视图模型添加常用功能。

例如:

// 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. 
    // ... 
}