我用WPF,MVVM,Prism和Unity编写应用程序。从一个窗口我开始第二个窗口:
public void ShowForm(IPrescriptionViewModel viewModel)
{
var view = new PrescriptionForm();
view.SetDataContext(viewModel);
view.ShowDialog();
}
方法SetDataContext
public void SetDataContext(IPrescriptionViewModel viewModel)
{
if (viewModel == null) return;
DataContext = viewModel;
if (viewModel.CloseAction == null)
viewModel.CloseAction = new Action(this.Close);
}
在BTMPrescriptionViewModel中是一个属性
public Action CloseAction { get; set; }
和CloseCommandExecute
public ICommand CloseCommand => new RelayCommand(CloseCommandExecute);
private void CloseCommandExecute()
{
CloseAction();
}
它工作正常,但只有一次 - 第一次。关闭辅助窗口并再次打开后,不再使用命令按钮关闭,只能使用窗口的关闭按钮。关闭并打开父窗口后,可以再次使用命令按钮关闭辅助窗口,但只能再次关闭一次。
答案 0 :(得分:2)
缺乏可靠地再现问题的好Minimal, Complete, and Verifiable code example,无法确定问题是什么。但是,根据您在此处发布的代码,您似乎每次都在创建一个新窗口,但只设置CloseAction
属性一次。
由于您指定的CloseAction
委托值会捕获this
以调用Close()
方法,因此它始终在您创建的第一个窗口上调用Close()
,而不是任何你之后创造的。
如果没有更完整的代码示例,目前尚不清楚实现目标的最佳方式是什么。但是如果您只是取出空检查并且总是分配值,那么基本问题可能会得到解决:
public void SetDataContext(IPrescriptionViewModel viewModel)
{
if (viewModel == null) return;
DataContext = viewModel;
viewModel.CloseAction = this.Close;
}
请注意,您也不需要显式调用委托构造函数。编译器具有处理委托类型的推理规则,只需引用方法名就足够了。