WPF Добавление элементов вкладок в элемент управления вкладками из нескольких моделей представлений - PullRequest
0 голосов
/ 12 декабря 2018

В моем главном окне у меня есть TabControl, ItemSource которого привязан к ObservableCollection<TabItem> в его модели представления (vmMainWindow).

В главном окне у меня также есть Menu с 2 MenuItems, (Альбомы, Исполнители)

Я создал Page и ViewModel для альбомов и исполнителей.

При щелчке по MenuItem с помощью RelayCommand я создаю Frame, чтобы удерживать релевантный Page привязанным к соответствующей модели представления.Затем я создаю новый TabItem, устанавливаю Content на новый Frame, затем добавляю новый TabItem к ObservableCollection<TabItem>.

    void MenuItemClick(object parameter)
    {
        switch (parameter)
        {
            case "Albums":
                Frame albumsFrame = new Frame { Content = new pgAlbums { DataContext = new vmAlbums() } };
                TabCollection.Add(new TabItem { Header = "Albums", Content = albumsFrame , IsSelected = true });
                break;
            case "Artists":
                Frame artistsFrame = new Frame { Content = new pgArtists { DataContext = new vmArtists() } };
                TabCollection.Add(new TabItem { Header = "Artists", Content = artistsFrame , IsSelected = true });
                break;
        }
    }

То, что я хотел бы сделать, это бытьЯ могу добавлять вкладки в ObservableCollection<TabItem> так же, как и в других Page View Models, но у меня нет доступа к TabCollection из них.Мне либо нужно где-то глобальное, чтобы разместить его вместо этого, либо каким-то образом разделить его между View Models.

Я знаю, что все это неправильно, поэтому я выкладываю это здесь, чтобы кто-то мог направить меня вправильное направление о том, что делать.Я новичок в MVVM, у меня есть только опыт работы с Winforms, но я хочу двигаться дальше.

1 Ответ

0 голосов
/ 12 декабря 2018

Вы можете использовать класс EventAggregator или Messenger для отправки сообщения, на которое подписывается другая модель представления.Пожалуйста, обратитесь к следующим ссылкам для получения дополнительной информации о концепции.

https://msdn.microsoft.com/en-us/magazine/jj694937.aspx

http://dotnetpattern.com/mvvm-light-messenger

https://blog.magnusmontin.net/2014/02/28/using-the-event-aggregator-pattern-to-communicate-between-view-models/

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

Преимущество использования агрегатора событий илимессенджер - это то, что вы избегаете тесной связи между издателем события и подписчиком, что должно упростить обслуживание приложения.И издатель, и подписчик события или сообщения знают только об агрегаторе событий или мессенджере, но они ничего не знают друг о друге.

Кстати, вы не должны создавать TabItems или какие-либо другиедругие визуальные элементы в модели представления.Вы должны создать экземпляры объектов данных, которые могут быть представлены визуальными элементами, такими как TabItems в представлении.

...