ICommand 未使用 MVVMLight 框架绑定到 Loaded 事件中

ICommand not binding in Loaded event using MVVMLight framework

我想知道为什么在 WPF 页面的 Loaded 事件中绑定按钮不起作用,只有在导航到另一个页面并返回后才会起作用。

我有一个清单应用程序,在主页上,大多数 ViewModel 都被调用,因为返回到特定列表的后退按钮是什么原因,它会开始绑定,即使该命令是不适用于该页面,它还会加载其他页面的集合。

所以我使用 Loaded 页面事件调用必要的方法来填充列表,并开始为这个特定页面绑定命令。我还使用 Unloaded 页面事件进行清理,例如取消订阅某些 CRUD 事件。

但现在的问题是,按钮没有在加载页面事件中绑定。不知道为什么..

我做了一个微型应用程序来演示这个问题。可以在这里下载 (包括完整的源代码) https://www.dropbox.com/s/qzumzyicuvrktsi/ICommandTest.zip?dl=0

这是因为您的视图没有收到有关 Command_ShowAddWindowCommand_ClickMe 更改的通知。让我解释一下:

当您的 Page 构造函数是第一个 运行 时,您的命令的绑定将被初始化并传输到视图,但到那时您的命令是 null,因此视图绑定两个按钮的命令 null.

然后,当您的 Loaded 事件被触发时,命令会被初始化,但视图不会收到通知,因此它会将命令绑定到 null

问题的解决方案是:

您在初始化命令时手动调用 RaisePropertyChanged 通知视图命令更改:

void InitCommands()
{
    Command_ShowAddWindow = new RelayCommand(Command_ShowAddWindow_Click);
    Command_ClickMe = new RelayCommand(Command_ClickMe_Click);
    RaisePropertyChanged("Command_ShowAddWindow");
    RaisePropertyChanged("Command_ClickMe");
}

或者您在 ViewModel 构造函数中初始化您的命令 DataBindings 初始化之前:

public ViewModel_Page1()
{
    InitCommands();
    ...
}