【发布时间】:2011-03-25 19:49:41
【问题描述】:
我的应用程序可以有多个设计器窗口。每个窗口由几个用户控件组成,这些控件在 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 处于活动状态。指挥就好了。
窗口 B 加载-窗口 B 视图模型构造函数将静态命令绑定到其对象命令处理程序。窗口 B 处于活动状态。指挥就好了。
现在,用户选择窗口 A 选项卡将窗口 A 设置为活动状态。指挥是行不通的。当然不会,因为 Command 绑定到 Window B 命令处理程序。
理论上,静态命令可以处理这种情况,因为在任何给定点都只有一个活动窗口。但是怎么做??
【问题讨论】:
-
命令的重点是更好地将逻辑与设计分离,使用事件使命令工作是错误的方法。
-
@Danny-maybe,但这完全不同,我有正当理由这样做。这里的问题是当有很多标签窗口时如何使全局命令绑定到活动窗口。
标签: wpf mvvm command icommand relaycommand