是否有一种方法可以动态地公开WPF中的绑定?

本文关键字:WPF 绑定 动态 方法 一种 是否 | 更新日期: 2023-09-27 18:05:10

这个问题可以写得更好,但基本上,这就是我想做的:

我正在为我们的应用程序组装一个行业专用的编辑器,基本功能像Word,但有一些医疗保健所需的额外工具。

功能被组织成逻辑组,例如,剪切命令(剪切-复制-粘贴),对齐等;这些都在ribbon控件中表示。

我们需要创建一个编辑器的实例,并根据上下文混合这些特性;例如,有时我们想要暴露"编校"组,有时我们想要暴露"成像"组。

所以比起一个带有一堆开关的大型整体编辑器类,我想将每个单独的命令分解到单独的类中,然后将它们分组到每个逻辑组的视图模型中,就像这样:

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()));

但是我不知道如何公开可能已经由任何其他组附加的数据绑定。这是错误的做法吗?

是否有一种方法可以动态地公开WPF中的绑定?

如果你使用的是office风格的Ribbon控件,那么正确的用户体验模式应该是将组放到Ribbon的不同选项卡中,然后控制哪些选项卡在运行时是可见的

<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>

我实现了类似的东西,用户可以在Ribbon控件上创建自己的按钮。我使用的是Actipro软件中的Ribbon控件。我将RibbonGroup项模板更改为水平方向的ItemsControl,并将ItemsSource绑定到ViewModel类中的"Actions"属性,每个通用的Action类都有一个按钮命令,它调用Invoke方法来执行该操作。