MVVM базовый вид модели класса - PullRequest
6 голосов
/ 05 июля 2011

Я работаю над созданием класса модели базового вида.ViewModelBase является абстрактным классом, и я хочу определить свойства, которые я хочу реализовать во всех моих других моделях производных представлений.

Одним из свойств является ObservableCollection:

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

Классы, которыепроизводные от этого базового класса будут иметь различные типы определенных элементов (ObservableCollection<Person>, ObservableCollection<Car>).

Если я установлю тип ObservableCollection на object в ViewModelBase, мне потребуется выполнить многоразличное приведение в производных классах, чтобы заставить его работать.

Это правильный подход?

Ответы [ 5 ]

11 голосов
/ 05 июля 2011

Я не совсем уверен, почему вы хотели бы сделать его таким универсальным, но если бы вы это сделали, я бы порекомендовал вам сделать также абстрактный базовый класс:

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

Я надеюсь,Вы также убедитесь, что ваш ViewModelBase реализует INotifyPropertyChanged.

2 голосов
/ 05 июля 2011

Если вы создаете модель базового вида для всех моделей представления в вашем приложении, то маловероятно, что каждый один будет содержать наблюдаемую коллекцию.

Вы можете рассмотреть возможность использования композиции вместо наследования (или, скорее, наследования) для добавления общих функций в модели представлений.

Например:

// 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.
    // ...
}
2 голосов
/ 05 июля 2011
public abstract ObservableCollection<TYPE> Items { get; set; }

Вы можете определить ТИП разными способами, в том числе при использовании / наследовании от базового класса или интерфейса.

0 голосов
/ 05 июля 2011

Вы хотите сделать базовый класс универсальным

Тогда у вас может быть определение, подобное этому

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> 

, если хотите

0 голосов
/ 05 июля 2011

Определите некоторый класс {Entity}, который может быть базовым классом Car и Person: вы получите то, что хотите + строгая типизация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...