gpt4 book ai didi

wpf - 多窗口 WPF 应用程序中的命令绑定(bind)

转载 作者:行者123 更新时间:2023-12-01 13:01:48 35 4
gpt4 key购买 nike

我的应用程序可以有多个设计器窗口。每个窗口由几个用户控件组成,这些控件在 RelayCommands 的帮助下进行动态通信。我创建了以下类作为指挥基础设施的支柱。

public static class Commands
{
public static readonly RoutedCommand EntityEditRequest = new RoutedCommand();
public static RelayCommand EntityEditorChangeRequest;
public static RelayCommand XMLUpdateRequest;
public static RelayCommand SaveRequest;
}

用户控件的每个 View 模型都将在构造函数中执行类似的操作

 public XMLEditorViewModel()
{
Commands.Commands.SaveRequest = new RelayCommand(Save_Executed);
Commands.Commands.XMLUpdateRequest = new RelayCommand(UpdateXML);
}

但是,我完全忽略了应用程序可以有多个窗口这一点。当打开每个窗口时,将为该特定窗口设置静态命令。

例子:

窗口 A 已打开 - 用户控件的构造函数设置了 RelayCommands,一切正常。

窗口 B 打开 - 用户控件的构造函数设置 RelayCommands。窗口 A 的命令绑定(bind)丢失了!

所以当我将选项卡更改为窗口 A(窗口是选项卡式的)时,没有任何命令在工作。

我需要一些想法,以便在我更改选项卡时事件窗口始终设置命令。我可以尝试将命令放在 tab_selection_changed 事件中,但不知何故对我来说它看起来很糟糕。有没有正确的方法来做到这一点?非常感谢任何帮助。

编辑:

事实证明这个问题让读者有些困惑。我不是要为一个命令创建多个订阅者。在任何给定点,只有一个窗口处于事件状态。这个窗口包含几个用户控件——其中一些是在命令的帮助下动态加载的;但是每个命令都由一个 View 模型类处理——所以没有多个订阅者。我的问题是应用程序可以在选项卡中加载多个窗口 - 在任何给定点只有一个窗口处于事件状态 - 但用户可以对不同的选项卡进行操作并使另一个窗口处于事件状态。当 View 模型构造函数分配静态 RelayCommands 时,当加载每个新窗口时,静态命令将设置为新绑定(bind)。

Window 一个打开的窗口 一个 View 模型构造函数将静态命令绑定(bind)到它的对象命令处理程序。窗口 A 处于事件状态。指挥很好。

窗口 B 加载窗口 B View 模型构造函数将静态命令绑定(bind)到其对象命令处理程序。窗口 B 处于事件状态。指挥很好。

现在,用户选择窗口 A 选项卡以将窗口 A 设置为事件状态。命令行不通。当然不会,因为命令绑定(bind)到窗口 B 命令处理程序。

理论上静态命令可以处理这种情况,因为在任何给定点都只有一个事件窗口。但是怎么办呢??

最佳答案

全局命令应该是 CompositeCommand或类似的方法(CompositeCommand 来自 Prism)。这将允许多个 child 使用该命令注册。

  public static CompositeCommand SaveCommand = new CompositeCommand();

然后可以跨 ViewModel 或在适用的情况下访问该命令......

  SaveCommand = new DelegateCommand<object>(Save, CanExecuteSave);
GlobalCommands.SaveCommand.RegisterCommand(SaveCommand);

然后您可以利用 IActiveAware interface定义哪个 Window 是事件的 Window 并相应地执行命令。

creating globally available commands 上还有一个 MSDN 帖子.不要忘记注销命令以避免内存泄漏。

关于wpf - 多窗口 WPF 应用程序中的命令绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5437414/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com