Я создаю MVVM применение и в Модели раздела У меня есть простой базовый абстрактный класс животные и класс Собака, который является производным от него:ObservableCollection родового класса ViewModel
public abstract class Animal
{
public int Age { get; set; }
}
public class Dog : Animal
{
public string Name { get; set; }
}
ViewModel раздел содержит UI-friendly VM классы из них:
public abstract class AnimalVM<T> : ViewModelBase where T : Animal
{
protected readonly T animal;
public int Age
{
get { return animal.Age; }
set
{
animal.Age = value;
OnPropertyChanged("Age");
}
}
protected AnimalVM(T animal)
{
this.animal = animal;
}
}
public class DogVM : AnimalVM<Dog>
{
public string Name
{
get { return animal.Name; }
set
{
animal.Name = value;
OnPropertyChanged("Name");
}
}
public DogVM(Dog dog) : base(dog) { }
}
Предположим, у меня есть еще VM класс, который содержит ObservableCollection<AnimalVM>
. Проблема в том, как создать такой вид собственности, который позволяет мне хранить там разные типы Animal? Я хочу, чтобы достичь чего-то вроде этого:
public class AnimalListVM : ViewModelBase
{
// here is a problem, because AnimalVM<Animal> isn't compatible with DogVM
readonly ObservableCollection<AnimalVM<Animal>> animals;
public ObservableCollection<AnimalVM<Animal>> Animals
{
get { return animals; }
}
public AnimalListVM(IList<Animal> animals)
{
//this.animals = ...
}
}
Я могу изменить ObservableCollection<AnimalVM<Animal>>
свойство ICollection
свойство, а затем создать список AnimalVM используя некоторый словарь Animal ->AnimalVM обертка и Activator.CreateInstance()
- он работает, но когда Я пытаюсь расширить AnimalListVM, добавив еще одно свойство SelectedAnimal
, которое будет привязано к образцу Просмотр, например Управление DataGrid У меня есть другая проблема с типом такого свойства SelectedItem
. Он не может быть типа AnimalVM<Animal>
, потому что когда у меня есть объект DogVM в моей коллекции, он не поместится с этим и исключит.
Все будет ясно, если только я имел необщего AnimalVM, но я не хочу, чтобы скопировать и вставить аналогичные свойства в каждом DogVM, CatVM, BirdVM класса, производного от AnimalVM. Как я могу это достичь?