Является ли это приемлемой практикой управления представлениями в приложении WPF с использованием Prism? - PullRequest
0 голосов
/ 20 августа 2010

Я пишу приложение WPF MVVM с использованием Prism. Пару дней назад я спросил о лучших методах управления различными взглядами и не получил много отзывов. Смысл в том, что я придумала систему, которая, кажется, работает, но я хочу быть уверенной, что меня не уволят.

Я следовал инструкциям на http://development -guides.silverbaylabs.org / , чтобы получить настройки оболочки и уверен, что мои модули хорошо регистрируются.

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

По существу, модуль имеет контроллер, который отслеживает текущее представление, затем, когда пользователь хочет переключить представления, он вызывает команду Regions.Remove и затем команду add, чтобы заменить его текущим представлением. Кажется, должно быть более элегантное решение, чтобы просто переключаться между различными зарегистрированными представлениями, но я не нашел его.

Все возможные виды для модуля регистрируются в контейнере Unity при инициализации модуля.

Контроллер и функция переключения вида:

namespace HazardModule
{
    public class HazardController : IHazardController
    {

        private object CurrentView;
        public IRegionManager RegionManager { get; set; }
        private IUnityContainer _container;

        public HazardController(IUnityContainer container)
        {
            _container = container;
        }

        /// <summary>
        /// Switches the MainRegion view to a different view
        /// </summary>
        /// <typeparam name="T">The class of the view to switch to</typeparam>
        public void SiwthToView<T>()
        {
            if (CurrentView != null)
            {
                RegionManager.Regions["MainRegion"].Remove(CurrentView);
            }
            CurrentView = _container.Resolve<T>();
            RegionManager.Regions["MainRegion"].Add(CurrentView);
        }

    }
}

Любая обратная связь или другие лучшие решения будут оценены.

1 Ответ

1 голос
/ 07 сентября 2010

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

В основном у меня есть класс ViewController, который является свойством в моем классе ViewModelBase. Это позволяет всем моим моделям ViewM получить доступ к нему за один раз. Затем в моем классе ViewController у меня есть несколько методов управления отображением. Правильность такого подхода, вероятно, спорна, но я нашел, что он хорошо работает в моем случае

    public TView ShowViewInRegion<TView>(string regionName, string viewName, bool removeAllViewsFromRegion)
    {
        var region = regionManager.Regions[regionName];

        var view = region.GetView(viewName) ?? container.Resolve<TView>();

        if (removeAllViewsFromRegion)
        {
            RemoveViewsFromRegion(region);
        }

        region.Add(view, viewName);
        region.Activate(view);

        if (regionName == RegionNames.OverlayRegion)
        {
            eventAggregator.GetEvent<PopupWindowVisibility>().Publish(true);
        }

        return (TView)view;
    }

    public void RemoveViewsFromRegion(string regionName)
    {
        RemoveViewsFromRegion(regionManager.Regions[regionName]);
    }

    private void RemoveViewsFromRegion(IRegion region)
    {
        for (int i = 0; i < region.Views.Count() + i; i++)
        {
            var view = region.Views.ElementAt(0);
            region.Remove(view);
        }

        if (region.Name == RegionNames.OverlayRegion)
        {
            eventAggregator.GetEvent<PopupWindowVisibility>().Publish(false);
        }
    }

    private static void DeactivateViewsInRegion(IRegion region)
    {
        for (var i = 0; i < region.ActiveViews.Count(); i++)
        {
            var view = region.ActiveViews.ElementAt(i);
            region.Deactivate(view);
        }
    }

Тогда всякий раз, когда мне нужно отключить представление или что-то, что я могу просто вызвать из моей ViewModel

    public void ExecuteCreateUserCommand()
    {
        ViewController.ShowViewInRegion<IUserCreateView>(RegionNames.ContentRegion, ViewNames.UserCreateView, true);
    }
...