2011-07-05 23 views
6

Estoy trabajando en la creación de una clase de modelo de vista base. ViewModelBase es una clase abstracta y quiero definir las propiedades que deseo que implementen todos mis otros modelos de vista derivados.MVVM vista de base clase de modelo

Una de las propiedades es un ObservableCollection:

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

Las clases que se derivan de esta clase base tendrán diferentes tipos de artículos definidos (ObservableCollection<Person>, ObservableCollection<Car>).

Si configuré el tipo ObservableCollection en object en ViewModelBase, me exigiría hacer una gran cantidad de fundiciones diferentes en las clases derivadas para que funcione.

¿Es este el enfoque correcto?

Respuesta

11

No estoy muy seguro de por qué desea hacerlo de modo genérico, pero si lo hizo, le recomiendo que haga la clase base abstracta genérica así:

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

Te espero también asegúrese de que su ViewModelBase implemente INotifyPropertyChanged.

+0

Gracias por esto. No puedo creer que me haya olvidado por completo de los genéricos. La razón por la que lo hago de esta manera es porque muchos de mis modelos de vista son prácticamente idénticos, excepto por algunas diferencias menores, así que quería poner las cosas en común en la clase base. – Flack

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

Puede definir el TYPE de muchas maneras, incluso cuando usa/hereda de la clase base o Interface.

0

Define alguna clase {Entity} que pueda ser una clase base de Car y de una Persona: obtendrás lo que deseas + strong typing.

0

Usted quiere que su clase base genérica

A continuación, puede tener un defition como esto

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

Si desea una lista de ViewModels entonces recomendaría la creación de una clase base genérica no que la genérico hereda fuera y tienen una lista de ese

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

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

, entonces puede tener un

ObservableCollection<NonGenericBaseViewModel> 

si quieres

2

Si va a crear una vista de modelo de base para todos los los modelos de vista de su aplicación, entonces es poco probable que todos los y cada uno será la celebración de una colección observable.

Puede considerar el uso de la composición en lugar de la herencia (o más probable, así como la herencia) para agregar funcionalidad común a sus modelos de vista.

Por ejemplo:

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