2011-07-05 17 views
6

Pracuję nad utworzeniem klasy modelu widoku podstawowego. ViewModelBase jest klasą abstrakcyjną i chcę zdefiniować właściwości, które mają zostać zaimplementowane przez wszystkie pozostałe modele pochodnych widoków.Podstawowa klasa modelu MVVM klasy

Jedną z właściwości jest ObservableCollection:

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

Klasy, które wywodzą się z tej klasy podstawowej będą miały różne rodzaje przedmiotów zdefiniowana (ObservableCollection<Person>, ObservableCollection<Car>).

Jeśli ustawię typ ObservableCollection na object w ViewModelBase, wymagałoby to ode mnie wykonania wielu różnych rzutowania w klasach pochodnych, aby działał.

Czy to właściwe podejście?

Odpowiedz

11

Nie jestem pewien, dlaczego chcesz zrobić to tak uniwersalne, ale jeśli nie, to polecam, aby uczynić abstrakcyjna klasa podstawowa rodzajowe, a także:

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

Mam nadzieję, że upewnij się także, że twoja ViewModelBase implementuje INotifyPropertyChanged.

+0

Dzięki za to. Nie mogę uwierzyć, że zupełnie zapomniałem o generykach. Powodem, dla którego robię to w ten sposób, jest to, że wiele z moich modeli widoków jest prawie identycznych, z wyjątkiem kilku drobnych różnic, więc chciałem umieścić typowe rzeczy w klasie bazowej. – Flack

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

Możesz zdefiniować TYPE na wiele sposobów, w tym podczas korzystania/dziedziczenia z klasy bazowej lub interfejsu.

0

Definiowanie klasy {Entity}, która może być podstawową klasą Car and a Person: dostaniesz to, co chcesz + mocne pisanie.

0

Chcesz, aby twoja klasa podstawowa rodzajowe

Wtedy można mieć defition jak ten

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

Jeśli chcesz listę ViewModels następnie polecam tworzenia non rodzajowego klasy bazowej że im generic jeden dziedziczy się i mieć listę tego

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

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

wtedy można mieć

ObservableCollection<NonGenericBaseViewModel> 

jeśli chcesz

2

Jeśli tworzysz widok bazowy model wszystkich The View modeli w swojej aplikacji, to jest mało prawdopodobne, że każdy pojedynczy jeden będą gospodarstwa zaobserwowania kolekcji.

Można rozważyć użycie kompozycji zamiast dziedziczenia (lub bardziej prawdopodobnego, jak również dziedziczenia), aby dodać wspólną funkcjonalność do modeli widoku.

Na przykład:

// 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. 
    // ... 
} 
Powiązane problemy