今天我遇到了一些类似下面的代码。 它非常简化,希望您可以阅读错误。
用于打开新视图的ViewHelper类。
public void DisplayView(ViewBase viewModel)
{
view = GetView(viewModel);
view.Owner = GetOwner(view);
view.ShowDialog(); //Will never return if view.Owner closes itself before view.
}
查看能够打开另一个对话框的模型类。
public class MyViewModel : ViewModelBase
{
private Action<int> _callback;
public int SelectedInt { get; set; }
public MyViewModel(Action<int> callback)
{
_callback = callback;
}
public void AcceptAndClose()
{
_callback.Invoke(SelectedInt);
Close();
}
public void Close()
{
// Closes corresponding View
}
public void NewDialog()
{
var callback = p =>
{
this.SelectedInt = p;
this.AcceptAndClose();
}
ViewHelper.DisplayView(new MyViewModel(callback));
}
}
我发现它的问题是,如果我们在MyViewModel类中使用NewDialog()打开一个新的Dialog,并且新的viewmodel运行AcceptAndClose(),它将永远不会正确关闭,因为它的所有者通过回调关闭自己它可以做到。
可以通过更改AcceptAndClose()函数来解决此问题,以便在调用回调之前将其自行关闭。但它似乎很容易出错。 避免这种情况发生的最佳做法是什么?
答案 0 :(得分:2)
相信我,当我说这条道路确定未来失败时。 您的viewmodel应该永远不了解视图。
您的视图应调用viewmodel。
它也解决了你的问题;)