Правильный способ в стиле MVVM добавить кнопку на панель инструментов из модуля Prism.

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

Я написал такой код:

public class MyModule : IModule
{
    private readonly IUnityContainer _container;
    public MyModule(IUnityContainer Container) { _container = Container; }

    public void Initialize()
    {
        var regionManager = _container.Resolve<RegionManager>();
        regionManager.RegisterViewWithRegion("MainToolbar",
                                             () => new Button
                                                   {
                                                       Content = "My Button",
                                                       Command = new DelegateCommand(/*  */)
                                                   });
    }
}

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

Что именно я делаю неправильно? Как правильно собрать действия из нескольких модулей в одну панель инструментов?


person Paboka    schedule 10.06.2016    source источник
comment
Используйте модель, чтобы инкапсулировать действие, выполняемое для этой кнопки. Используйте DataTemplate для визуализации кнопки и поместите эту модель кнопки (вместе со всеми другими необходимыми моделями кнопок) в коллекцию, привязанную к панели инструментов, которая является ItemsControl. Панель инструментов возьмет каждую модель кнопки в коллекции, найдет шаблон и отобразит кнопку. Это МВВМ. edit На самом деле, если все модели имеют одинаковые имена свойств, вам нужно использовать только ToolBar.ItemTemplate для привязки кнопки к каждой из моделей.   -  person    schedule 10.06.2016


Ответы (1)


Ваша идея верна, просто замените кнопку на представление, содержащее кнопку. Затем сделайте панель инструментов областью и вставьте представление «кнопки» в область «панели инструментов».

Если ваш модуль зависит от сервисов, которые поступают из других модулей, сделайте ваш модуль зависимым от этих модулей, чтобы prism позаботился о том, чтобы сначала инициализировались сервисы:

[ModuleDependency("ServiceModule")]
public class ModuleA : IModule
{
    ...
}

public class ServiceModule : IModule
{
    ...
}
person Haukinger    schedule 10.06.2016