调用一个View并等到窗口关闭在MVVM中是否可行?

时间:2013-09-27 21:46:32

标签: c# wpf xaml mvvm architecture

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

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

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

3 个答案:

答案 0 :(得分:0)

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

        base.OnClosing(e);
    }

将其放在后端视图中

答案 1 :(得分:0)

  doSomething();
this.Dispatcher.BeginInvoke(new Action(() =>
        {
          aView = new View();
           aView.Show();
        }), DispatcherPriority.Background);

在代码上方使用以满足您的要求。

答案 2 :(得分:0)

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

以下是一个例子:

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

在某处实例化您的服务实现并将其传递给您的logic / viewmodel。一个好方法是使用IOC-Container。有关详细信息,请查看ViewmodelLocator class with MVVM Light Framework

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() 
    {
        //...
    }
}

由于在对您的viewmodel进行软件测试时无法轻松打开并与视图相关联,因此请在方法调用后立即创建一个假定关闭视图的服务测试。

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

希望这是有帮助的