我用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();
}
它工作正常,但只有一次-第一次。关闭第二个窗口并再次打开它之后,它不再通过命令按钮关闭,而仅通过窗口的关闭按钮关闭。关闭并打开父窗口后,可以再次使用命令按钮关闭辅助窗口,但只能再次一次。
最佳答案
缺少可靠的Minimal, Complete, and Verifiable code example可以可靠地重现该问题,因此无法确定是什么问题。但是,根据您在此处发布的代码,您似乎每次都在创建一个新窗口,但是只设置一次CloseAction
属性。
因为您分配的CloseAction
委托(delegate)值捕获this
来调用Close()
方法,所以它始终在您创建的第一个窗口上调用Close()
,而不是随后创建的任何窗口。
如果没有更完整的代码示例,则不清楚实现目标的最佳方法是什么。但是,如果您只执行空检查并始终分配值,则可能会解决基本问题:
public void SetDataContext(IPrescriptionViewModel viewModel)
{
if (viewModel == null) return;
DataContext = viewModel;
viewModel.CloseAction = this.Close;
}
请注意,您也不需要显式调用委托(delegate)构造函数。编译器具有用于处理委托(delegate)类型的推理规则,仅引用方法名称就足够了。
关于c# - WPF和MVVM : CloseAction don't work,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40276989/