我用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/

10-12 05:07