C# 有没有办法在WPF中动态公开绑定?

C# 有没有办法在WPF中动态公开绑定?,c#,wpf,C#,Wpf,这个问题可以用更好的措辞,但基本上,这就是我想做的: 我正在为我们的应用程序准备一个特定于行业的编辑器,基本功能如Word,但还有一些医疗保健所需的额外工具 该功能被组织为逻辑组,例如,剪辑命令(剪切复制粘贴)、对齐等;它们在功能区控件中表示 我们需要创建一个编辑器实例,根据上下文混合使用这些特性;e、 有时我们想暴露“编校”组,有时我们想暴露“成像”组 因此,我希望将每个单独的命令分解为单独的类,然后将它们分组到每个逻辑组的视图模型中,而不是一个带有一系列切换的大型单片编辑器类,类似这样: c

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

我正在为我们的应用程序准备一个特定于行业的编辑器,基本功能如Word,但还有一些医疗保健所需的额外工具

该功能被组织为逻辑组,例如,剪辑命令(剪切复制粘贴)、对齐等;它们在功能区控件中表示

我们需要创建一个编辑器实例,根据上下文混合使用这些特性;e、 有时我们想暴露“编校”组,有时我们想暴露“成像”组

因此,我希望将每个单独的命令分解为单独的类,然后将它们分组到每个逻辑组的视图模型中,而不是一个带有一系列切换的大型单片编辑器类,类似这样:

class Cut: ICommand {}
class Copy: ICommand {}

class ClipCommands {
    public ICommand Cut { get { return _cutCommand; } }
    public ICommand Copy { get { return _copyCommand; } }
}
所以现在我想弄清楚如何在主编辑器viewmodel中动态地公开这些组,而不必对它们进行硬编码。我想到了一些类似于装饰图案的东西:

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

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

如果您使用的是Office样式的功能区控件,那么正确的用户体验模式是将组放入功能区上的不同选项卡中,然后控制哪些选项卡在运行时可见

<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>

...

<ribbon:RibbonTab Visibility="{Binding ShowThisRibbonTab, Converter={StaticResource BooleanToVisibilityConverter}}">
</ribbon:RibbonTab>

...
如果要使选项卡中的组可见,请绑定RibbonGroup的可见性

编辑我想我误解了这个问题。您遇到的问题不是UI,而是ViewModel的组成

<ribbon:RibbonTab DataContext="{Binding EditViewModel}">
</ribbon:RibbonTab>
<ribbon:RibbonTab DataContext="{Binding FormatViewModel}">
</ribbon:RibbonTab>
<ribbon:RibbonTab DataContext="{Binding PrintViewModel}">
</ribbon:RibbonTab>
可以将每个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控件。我将
RibbongGroup
项模板更改为水平方向的
ItemsControl
,并将
ItemsSource
绑定到我的ViewModel类中的“Actions”属性,每个通用操作类都有一个按钮命令,该按钮调用执行该操作的
Invoke
方法。

Yea,这不是UI,而是我正在挣扎的VM。如果我们在选项卡和它们包含的功能之间有一对一的关系,那么每个选项卡单独的datacontext可能会起作用,但我们没有。一个选项卡可能需要3或4组不同命令的功能,这些命令也是根据上下文动态创建的。请参阅编辑的答案。为每个命令创建一个泛型类,让您的ViewModel决定将哪些命令加载到集合中,并编辑功能区模板以允许您将按钮绑定到ItemsSource。有趣的方法是,我没有考虑将集合用于命令绑定。谢谢