Я пытаюсь создать список на экране всех животных в базе данных в приложении MVFM WPF, но этот список должен содержать свойства, которые относятся к соответствующему полу животных (представленному классом).
Модель состоит из Male
и Female
классов, наследуемых от MustInherit Animal
. Следуя этому примеру , ViewModel также делится на MaleViewModel
и FemaleViewModel
, которые оба наследуются от общего MustInherit AnimalViewModel
, ниже
Public MustInherit Class AnimalViewModel(Of T as Animal)
Inherits GalaSoft.MvvmLight.ViewModelBase
Public Property Animal As T
Protected Sub New(NewAnimal as T)
Me.Animal = NewAnimal
End Sub
Public Overrides Function ToString() as String
Return String.Format("{1}{2} ""{3}"" | {4}",
Me.Animal.RightEarTag,
Me.Animal.LeftEarTag,
Me.Animal.ShortName,
Me.SexIdentifierName)
End Function
'Makes a distinction between "bull", "cow", "steer", "heifer",
'or other classes as needed
Public MustOverride Function SexIdentifierName as String
End Class
Public Class MaleViewModel
Inherits AnimalViewModel(Of Male)
Public Sub New(AnAnimal as Male)
MyBase.New(AnAnimal)
End Sub
Public Overrides Function SexIdentifierName as String
'Logic goes here
End Function
End Class
Я также создал AnimalListWorkspace
ViewModel со свойством AnimalList
, которое связано с UserControl в представлении. Я хотел бы добавить правильный тип ViewModel в этот список, но недопустимо приводить базовый тип к унаследованному типу , как я пытался в следующем коде.
Public Class AnimalListWorkspace
Inherits WorkspaceViewModel
Public ReadOnly Property AnimalList as IEnumerable(Of AnimalViewModel(Of Animal))
Get
Dim animalVmList = New List(Of AnimalViewModel(Of Animal))
For Each an in AnimalDatabase.Animals
If TypeOf an Is Male Then
animalVmList.Add(New MaleViewModel(Ctype(an, Male)))
ElseIf TypeOf an Is Female Then
animalVmList.Add(New FemaleViewModel(Ctype(an, Female)))
Else
Throw New InvalidCastException("Unknown sex/type of animal")
End If
Next
Return animalVmList
End Get
End Property
Как лучше всего обращаться с этими вычисленными свойствами MustOverride? Я рассмотрел
Перемещение их реализации до AnimalViewModel
Изменение объекта базы данных для извлечения Males
и Females
, в частности
Эти решения могут работать в этом примере, потому что унаследованных членов так мало, но они оба кажутся тесно связанными и их трудно реорганизовать позже.