我的代码中有一个特定的情况,做这样的事情会很好(伪代码):
aView = new View();
aView.Show();
doSomething();
我希望“doSomething()”仅在“aView”窗口关闭后运行。这在 MVVM 中可行/适合吗?如果是这样,最好的方法是什么?
我的代码中有一个特定的情况,做这样的事情会很好(伪代码):
aView = new View();
aView.Show();
doSomething();
我希望“doSomething()”仅在“aView”窗口关闭后运行。这在 MVVM 中可行/适合吗?如果是这样,最好的方法是什么?
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
blah............................
base.OnClosing(e);
}
把这个放在aview后端
doSomething();
this.Dispatcher.BeginInvoke(new Action(() =>
{
aView = new View();
aView.Show();
}), DispatcherPriority.Background);
使用上面的代码来满足您的要求。
使用 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();
}
}
希望这会有所帮助