我的应用程序可以有多个设计师窗口。每个窗口由几个用户控件组成,这些控件通过RelayCommands动态通信。我创建了以下类作为命令基础设施的支撑。
public static class Commands
{
public static readonly RoutedCommand EntityEditRequest = new RoutedCommand();
public static RelayCommand EntityEditorChangeRequest;
public static RelayCommand XMLUpdateRequest;
public static RelayCommand SaveRequest;
}
每个用户控件的视图模型在构造函数中都会执行以下操作
public XMLEditorViewModel()
{
Commands.Commands.SaveRequest = new RelayCommand(Save_Executed);
Commands.Commands.XMLUpdateRequest = new RelayCommand(UpdateXML);
}
然而,我完全忽略了应用程序可以有多个窗口。每次打开一个新窗口时,静态命令都会为该特定窗口设置。例如:打开窗口A,用户控件的构造函数设置RelayCommands,一切正常。打开窗口B,用户控件的构造函数设置RelayCommands,窗口A的命令绑定丢失!因此,当我切换到窗口A的选项卡时(这些窗口是选项卡式的),没有任何命令起作用。我需要一些想法,以便在切换选项卡时,活动窗口总是设置命令。我可以尝试将命令放入tab_selection_changed事件中,但这样做对我来说似乎不太好。是否有适当的方法来解决这个问题?非常感谢任何帮助。编辑:读者们对这个问题有点困惑。我不是要为一个命令创建多个订阅者。在任何给定时间只有一个窗口处于活动状态。该窗口包含几个用户控件-其中一些使用命令动态加载;但每个命令都由单个视图模型类处理-因此没有多个订阅者。我的问题是应用程序可以在选项卡中加载多个窗口-任何给定时间只有一个窗口处于活动状态-但用户可以切换到不同的选项卡并使另一个窗口处于活动状态。由于视图模型构造函数分配了静态RelayCommands,因此每次加载新窗口时,静态命令都会设置为新绑定。例如:打开窗口A,窗口A视图模型构造函数将静态命令绑定到其对象命令处理程序。窗口A处于活动状态。命令正常工作。加载窗口B,窗口B视图模型构造函数将静态命令绑定到其对象命令处理程序。窗口B处于活动状态。命令正常工作。现在,用户选择窗口A选项卡以将窗口A设置为活动状态。命令无法工作。当然不行,因为命令绑定到窗口B的命令处理程序。从理论上讲,静态命令可以处理该场景,因为任何给定时间只有一个活动窗口。但是怎么做呢?