我的代码中有一个特定的情况,做这样的事情非常好(伪代码):
aView = new View();
aView.Show();
doSomething();
我希望“doSomething()”仅在“aView”窗口关闭后才能运行。这在MVVM中是否可行/适合?如果是这样,最好的方法是什么?
答案 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();
}
}
希望这是有帮助的