假设一个标准的 Desktop Explorer 风格的应用程序:
- 顶部的菜单
- 左边的导航树
- 右侧的项目 View
一切都整齐地分为菜单、导航和项目模块。
该菜单有一个通用的“ View ”->“显示模式”菜单选择,可在以下之间更改当前项目 View :
- “图标 View ”
- “ ListView ”
- “详细 View ”
为了捕捉显示类型的变化,我目前发布并订阅了一个 DisplayModeChanged 事件。
第一个问题:
此菜单选项应仅在具有显示模式的适当 View 可见时显示。 控制共享菜单按钮的最佳方式是什么,以便它们仅在至少一个相关 View 处于事件状态时显示?
第二个问题:
如果在进行选择后出现 View ,它应该如何从菜单中获取当前显示模式状态?
最佳答案
我的第一个想法是,您可以通过将项目 View 菜单设置与项目 View 一起存储在某处来解决第一个问题。然后,在 View 激活时,您会向新 View 询问它想要显示的“自定义菜单操作”,其中之一是项目 View 的“显示模式”。其他 View 将提供其他菜单操作,而不会显示此菜单操作。
但此解决方案与您的第二个要求相矛盾,因为您显然希望拥有一些全局“ItemViewDisplayModeSetting”,并且无论何时更改,您都希望通知所有项目 View 并一起更改它们的显示模式。
那么,让我们通过应用依赖注入(inject)原则来正确解决它。不要找东西,要东西。您的菜单呈现器( View 模型)需要一些服务来知道是否有事件的项目 View 。您的 item view presenter 需要一项服务,该服务将提供初始显示模式并通知其更改。我们最终得到这段代码:
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
}
}
然后您需要一些方法来从菜单编辑您的显示模式...您可以将它们组合到 IDisplayModeService 中,或者您可以为此创建一个新界面。该实现将是一个简单的类,它包含一个 DisplayMode 实例,您将该类的一个实例注入(inject)到所有菜单和项目 View 中。您还需要实现 IActiveViewsService
,这个可能会包装来自 PRISM 的 IRegionManager 或您的 UI 管理机制......它将监听区域变化并在创建新项目 View 时使用react或当没有人离开时。
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.
关于silverlight - 在 Silverlight Prism 应用程序中支持多个 "display modes"菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3595563/