WPF& MVVM:CloseAction不起作用

时间:2016-10-27 05:47:13

标签: c# wpf mvvm

我用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();
    }

它工作正常,但只有一次 - 第一次。关闭辅助窗口并再次打开后,不再使用命令按钮关闭,只能使用窗口的关闭按钮。关闭并打开父窗口后,可以再次使用命令按钮关闭辅助窗口,但只能再次关闭一次。

1 个答案:

答案 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;
}

请注意,您也不需要显式调用委托构造函数。编译器具有处理委托类型的推理规则,只需引用方法名就足够了。