2010-11-17 4 views
2

Я создаю 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. Как я могу это достичь?

ответ

2

Хорошо, я нашел решение, и, конечно, это очень просто: просто создайте еще один, не общий абстрактный базовый класс для вашего общего абстрактного базового класса, а затем выведите свой общий класс из этого вновь созданного неродного класса. В этом случае вы также должны переписать свойства из не общего класса в общий класс (более конкретно, переопределить их), но вы делаете это только один раз, поэтому вам не нужно копировать и вставлять один и тот же код в каждый генерируемый ViewModel (в нашем примере в каждом DogVM, CatVM, BirdVM и т. д.).

Смежные вопросы