Как работать со свойствами MustOverride (виртуальными) в унаследованных моделях представления - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь создать список на экране всех животных в базе данных в приложении 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? Я рассмотрел

  1. Перемещение их реализации до AnimalViewModel

  2. Изменение объекта базы данных для извлечения Males и Females, в частности

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

1 Ответ

0 голосов
/ 29 июня 2018

Аргументы типа кажутся ненужными. Конструктор базового класса принимает Animal и в любом случае знает только о животных. Male - это определенный тип Animal. Следующее должно работать, то есть вы можете добавить любой тип определенного AnimalViewModel к List(Of AnimalViewModel).

Просмотр моделей:

Public MustInherit Class AnimalViewModel
    Inherits GalaSoft.MvvmLight.ViewModelBase

    Public Property Animal As Animal

    Protected Sub New(NewAnimal As Animal)
        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

    Public MustOverride Function SexIdentifierName() As String

End Class

Public Class MaleViewModel
    Inherits AnimalViewModel

    Public Sub New(AnAnimal As Male)
        MyBase.New(AnAnimal)
    End Sub

    Public Overrides Function SexIdentifierName() As String
        Return "Male"
    End Function
End Class

Модели:

Public Class Animal
    Public Property RightEarTag As String
    Public Property LeftEarTag As String
    Public Property ShortName As String
End Class

Public Class Male
    Inherits Animal

End Class

Рабочее пространство:

Public Class AnimalListWorkspace

    Public ReadOnly Property AnimalList As IEnumerable(Of AnimalViewModel)
        Get
            Dim animalVmList = New List(Of AnimalViewModel)

            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
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...