问题可能措辞得更好,但基本上,这就是我想要做的事情:
我正在为我们的应用程序整合一个行业特定的编辑器,像Word这样的基本功能,但需要一些医疗保健所需的额外工具。
功能被组织成逻辑组,例如剪辑命令(剪切复制粘贴),对齐等;这些都用带状控件表示。
我们需要根据上下文创建一些编辑器实例,并混合使用这些功能;例如有时候我们想揭露"编辑"小组,有时我们想揭露"成像"基。
因此,我想将每个单独的命令分解为单独的类,然后将这些命令分组到每个逻辑组的视图模型中,而不是一个大型的单片编辑器,而是将它们分组,如下所示:
class Cut: ICommand {}
class Copy: ICommand {}
class ClipCommands {
public ICommand Cut { get { return _cutCommand; } }
public ICommand Copy { get { return _copyCommand; } }
}
所以现在我试图弄清楚如何在主编辑器视图模型中动态公开这些组而不用硬编码。我想到了类似装饰模式的东西:
class ClipCommands: EditorBase
{
ClipCommands(EditorBase editor) {}
// expose my commands
// (!?) how do I expose any others already attached?
}
然后我可以构建我想要的所有功能。
var editor = new EditorBase(new ClipCommands(new RedactCommands()));
但是我对如何公开可能已被任何其他组附加的数据绑定感到迷茫。这是错误的做法吗?
答案 0 :(得分:1)
如果您使用的是Office样式的功能区控件,则正确的UX模式是将组放入功能区上的不同选项卡,然后控制哪些选项卡在运行时可见
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
...
<ribbon:RibbonTab Visibility="{Binding ShowThisRibbonTab, Converter={StaticResource BooleanToVisibilityConverter}}">
</ribbon:RibbonTab>
如果要在选项卡中显示组,则绑定RibbonGroups的可见性,而不是
编辑我想我误解了这个问题。它不是您遇到问题的UI,而是ViewModel的组成。
您可以将每个RibbonGroup的DataContext设置为不同的ViewModel。
<ribbon:RibbonTab DataContext="{Binding EditViewModel}">
</ribbon:RibbonTab>
<ribbon:RibbonTab DataContext="{Binding FormatViewModel}">
</ribbon:RibbonTab>
<ribbon:RibbonTab DataContext="{Binding PrintViewModel}">
</ribbon:RibbonTab>
我实现了类似的功能,用户可以创建自己的按钮来进行功能区控件。我正在使用Actipro软件的Ribbon控件。我将RibbonGroup
项模板更改为水平方向的ItemsControl
,并将ItemsSource
绑定到我的ViewModel类中的“Actions”属性,每个通用Action类都有一个按钮命令,它调用了执行操作的Invoke
方法。