1

我的代码中有一个特定的情况,做这样的事情会很好(伪代码):

aView = new View();
aView.Show();
doSomething();

我希望“doSomething()”仅在“aView”窗口关闭后运行。这在 MVVM 中可行/适合吗?如果是这样,最好的方法是什么?

4

3 回答 3

0
 protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
    {
        blah............................

        base.OnClosing(e);
    }

把这个放在aview后端

于 2013-09-27T21:58:35.813 回答
0
  doSomething();
this.Dispatcher.BeginInvoke(new Action(() =>
        {
          aView = new View();
           aView.Show();
        }), DispatcherPriority.Background);

使用上面的代码来满足您的要求。

于 2013-09-28T03:03:36.630 回答
0

使用 MVVM 时,最好将逻辑与视图分开,以保持代码可测试。您可以将与视图相关的代码(aView = new View()... 等)放在某种服务中并将其传递给您的视图模型。为了测试您的视图模型逻辑,您可以创建该服务的虚拟测试实现。

这是一个例子:

public interface IViewService
{
    void ShowViewAndWaitForClosing(Action _onViewClosed);    
}

创建服务接口的实现:

class ViewService : IViewService
{
    void ShowViewAndWaitForClosing(Action _onViewClosed)
    {
        AView view = new AView();
        view.Show();
        view.Closed += (o, e) => { _onViewClosed(); };
    }
}

在某处实例化您的服务实现并将其传递给您的逻辑/视图模型。一个很好的方法是使用 IOC-Container。有关这方面的更多信息,请查看带有 MVVM Light Framework 的 ViewmodelLocator 类

class SomeViewModel
{
    private IViewService mViewService;

    public SomeViewMode(IViewService _viewService)
    {
        mViewService = _viewService;

        //Whenever you need to show your View call:
        mViewService.ShowViewAndWaitForClosing(doSomething);
    }

    private void doSomething() 
    {
        //...
    }
}

由于在软件测试您的视图模型时您无法轻松地打开视图并与之交互,因此请创建一个服务的测试实现,在您的方法调用后立即假装关闭您的视图。

class TestViewService : IViewService
{
    void ShowViewAndWaitForClosing(Action _onViewClosed)
    {
        _onViewClosed();
    }
}

希望这会有所帮助

于 2013-09-30T10:42:39.483 回答