Доступ к модели родительского представления MVVM из коллекции - PullRequest
5 голосов
/ 11 января 2011

alt text

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

Мой MainWindow.xaml имеет свой текстовый текст данных, установленный как MainVM.

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 11 января 2011

Опираясь на то, что сказал Кент. , .

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

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

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

public class ViewModel
{
    private readonly MainVM _parent;

    public MainVM Parent => _parent;

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

тогда при создании вашей ViewModel вы можете просто:

 ViewModel vm = new ViewModel(this);
4 голосов
/ 11 января 2011

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

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

2 голосов
/ 11 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...