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