2011-01-11 2 views
5

alt textAccess MVVM родительский вид модели из коллекции в

На рисунке выше иллюстрирует мою программу. Стрелки указывают Binding.

My MainWindow.xaml имеет свой набор данных, указанный как MainVM.

Окно имеет элемент управления табуляцией, привязанный к ObservableCollection от ViewModel. Используя шаблон данных, элемент управления табулятора отображает представления, соответствующие ViewModel.

ObservableCollection находится в MainVM.

Как получить доступ к свойствам, найденным в MainVM от ViewModel (прилагается в ObservableCollection)?

Я открыт для ответов, требующих модификации моей модели программирования.

ответ

6

Основываясь на том, что сказал Кент. , ,

С точки зрения архитектуры ваш класс ViewModel не должен ничего знать о MainVM. Все, что ему нужно знать, должно быть передано экземпляру ViewModel, чтобы он мог оставаться атомарным и не беспокоиться о вещах, которые его называют. С точки зрения SOLID, это принцип инверсии зависимостей.

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

Метод overkill (который я не рекомендую), настраивает ваш конструктор, чтобы взять экземпляр MainVM, и передать в конструкторе this. например .:

public class ViewModel 
{ 
    private readonly MainVM _parent; 

    public MainVM Parent => _parent; 

    public ViewModel(MainVM parent) 
    { 
      _parent = parent; 
    } 
} 

тогда, когда вы создаете ViewModel вы можете просто:

ViewModel vm = new ViewModel(this); 
+1

Я изменил мою программу для работы с принципом Dependency Inversion.Теперь вместо MainVM, содержащего свойство, мои ViewModels содержат свойство и хранятся в синхронизации через MainVM. –

+0

Почему это перебор? Я согласен с идеей атомных виртуальных машин, но подобное родственное отношение приведено в примере в строке ((DataRow)) .Table –

2

Кто создает экземпляры ViewModel? Если существует плотная связь между MainVM и ViewModel, то, возможно, ViewModel должен принять экземпляр MainVM в своем конструкторе.

Альтернатива заключается в том, чтобы придумать другую конструкцию, которая не требует ViewModel, чтобы иметь доступ к MainVM. Для этого потребуется дополнительная информация (и отдельный вопрос).

4

В зависимости от того, сколько взаимодействия вам нужно, вы могли бы пойти другим путем, активировав события из класса ViewModel и имея MainVM обрабатывать их и задавать свойства для отдельного ViewModel соответственно.

Другой вариант, когда экземпляр ViewModel Collection (который я предполагаю, это делается в MainVM где-нибудь?), Вы можете просто передать в MainVM в качестве параметра конструктора и сохранить и экземпляр MainVM внутри каждого ViewModel.

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