Поддержка нескольких меню «Режимы отображения» в приложении Silverlight Prism - PullRequest
3 голосов
/ 29 августа 2010

Допустим, стандартное приложение в стиле Desktop Explorer:

  • меню сверху
  • дерево навигации слева
  • пункт просмотра справа

и все аккуратно разделено на модули Menu, Navigation и Item.

В меню есть общий выбор меню «Вид» -> «Режим отображения», который изменяет текущий вид элемента между:

  • «Вид значка»
  • "Просмотр списка"
  • «Подробный вид»

Чтобы отследить изменение типа отображения, я в настоящее время публикую и подписываюсь на событие DisplayModeChanged.

Первая проблема:

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

Вторая проблема:

Если представление появляется после выбора, как ему выбрать текущее состояние режима отображения из меню?

1 Ответ

2 голосов
/ 03 сентября 2010

Моей первой мыслью было, что вы могли бы решить первую проблему , сохранив где-нибудь настройки меню вида элемента вместе с вашим видом элемента .Затем, при активации представления, вы спросите свой новый вид о «пользовательских действиях меню», которые он хочет показать, и одним из них будет «Режим отображения» для представления элемента.Другие представления предоставят другие действия меню, и это не будет показано.

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

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

interface IActiveViewsService : INotifyPropertyChanged
{
    bool HasActiveViewsSupportingDisplayMode { get; }
}

interface IDisplayModeService : INotifyPropertyChanged
{
    DisplayMode DisplayMode { get; }
}

//your item view presenter (view model)
class ItemViewModel
{
    public ItemViewModel(IDisplayModeService displayModeService)
    {
        //obtain initial setting
        //subscribe to property changes
    }
}

//your menu presenter (view model)
class MenuViewModel
{
    public MenuViewModel(IActiveViewsService activeViewsService)
    {
        //obtain initial setting
        //subscribe to property changes
    }
}

Затем вам понадобится какой-то способ отредактировать ваш режим Diplay из меню ... вы можете объединить его вместе в IDisplayModeService или создать для этого новый интерфейс.Реализация будет простым классом, который содержит один экземпляр DisplayMode, и вы внедрите один экземпляр этого класса во все ваши меню и представления элементов.Вам также необходимо реализовать IActiveViewsService, этот, вероятно, обернет IRegionManager из PRISM или каким-либо другим механизмом управления вашим пользовательским интерфейсом ... он будет прослушивать изменения региона и реагировать, когда создается новое представление элемента или когда его нетслева.

interface IDisplayModeEditor
{
    void ChangeDisplayMode(DisplayMode newMode);
}

//your final menu presenter (view model)
class MenuViewModel
{
    public MenuViewModel(IActiveViewsService activeViewsService, IDisplayModeEditor modeEditor)
    {
        //obtain initial setting
        //subscribe to property changes
    }
}

//your final menu presenter (view model)
class DisplayModeStorage : IDisplayModeService, IDisplayModeEditor
{
    private DisplayMode displayMode;

    public DisplayMode DisplayMode 
    { 
        get { return this.displayMode; } 

        //standard propertychange notification
        set
        {
             if(value == this.displayMode)
                return;

             this.displayMode = value;
             this.RaisePropertyChanged("DisplayMode");
        }
    }

    public void ChangeDisplayMode(DisplayMode newMode)
    {
         this.DisplayMode = newMode;
    }
}

HTH.

...