[英]MVVM multiple Dialogs headache
我正在使用caliburn micro。 我的问题是如何管理对话框。 最大的问题是,因为当不使用窗口时,您的代码不会停止并等待。
所以我做了这样的事情。
public void ShowDialog(IScreen dialogModel, Action<object> callback = null)
{
ActivateItem(dialogModel);
if (callback != null)
dialogModel.Deactivated += delegate { callback(dialogModel); };
}
这有很多问题。例如,在某些情况下,我想显示对话框A,然后在回调中想显示对话框B,这是有问题的。为了避免重复,我必须为DoSomething编写一个额外的函数。我松开所有其他局部变量。.当需要更多级别时,问题更大。
showDialog(A, (cb)=>{
if(...) {
showDialog(B,(cb2)=>{
DoSomething();
});
}
else{
DoSomething();
}
});
也因为我想一次显示一个对话框,所以我扩展了Collection.OneActive。 但这也有问题。 在停用事件回调中,如果我愿意,我无法关闭所有功能! 因为它保留在内存中,所以触发了“停用”后的下一个引用,即使您清除它,它也会再次出现。
如何在对话框之间移动时使用类来跟踪状态信息,而不是像原始示例中那样嵌套闭包?
我认为您走在正确的道路上,但是似乎您有两个问题:
为了解决第一个问题,我建议将您的逻辑分解为不同的方法。 每次停用对话框时,您都可以使用一种方法来处理随后应执行的逻辑。
要解决第二个问题,您可以尝试创建一个类,该类负责存储要在对话框之间传递的信息。 此类的实例可以作为参数传递给将在停用对话框后执行的每个方法。
这是完成此操作的方法:
导体类
public class DialogTestsViewModel : Conductor<object>.Collection.OneActive
{
/// <summary>
/// Shows a dialog and executes its callback if necessary.
/// </summary>
/// <param name="dialogModel">The dialog view model to be shown.</param>
/// <param name="callback">The callback to be executed when dialog is closed.</param>
public void ShowDialog(IScreen dialogModel, Action callback = null)
{
// Show the dialog.
ActivateItem(dialogModel);
// If there is a callback, call it when dialog is closed / deactivated.
if (callback == null) return;
dialogModel.Deactivated += (sender, args) => callback();
}
/// <summary>
/// This method kicks off the dialog chain.
/// </summary>
public void ShowFirstDialog()
{
// Create a new context. This will hold state information
// as it is passed between dialogs.
var context = new TestDialogContext();
// Create the first dialog's view model.
var viewModel = new FirstDialogViewModel();
// Show the first dialog.
ShowDialog(viewModel, () => OnFirstDialogDeactivated(viewModel, context));
}
/// <summary>
/// Logic to be executed when the first dialog is closed.
/// </summary>
/// <param name="viewModel">The first dialog's view model.</param>
/// <param name="context">The state information.</param>
private void OnFirstDialogDeactivated(FirstDialogViewModel viewModel, TestDialogContext context)
{
// Check the view model here and store state information inside the context.
if (viewModel.SomethingIsChecked)
{
context.ShouldShowSecondDialog = true;
}
// Use information in the view model or the context to decide if we should show the next dialog.
// You could also make a decision about which dialog to show next here.
if (context.ShouldShowSecondDialog)
{
var secondDialog = new SecondDialogViewModel();
ShowDialog(secondDialog, () => OnSecondDialogDeactivated(context));
}
}
/// <summary>
/// Logic to be executed when the second dialog is closed.
/// </summary>
/// <param name="context">The state information.</param>
private void OnSecondDialogDeactivated(TestDialogContext context)
{
// Do more stuff.
}
}
对话框上下文类
在这里您将存储需要在对话框之间传递的状态信息。 我仅在此处包括一个属性作为示例,但是您可以在此处添加很多信息。
/// <summary>
/// State information to be passed between dialogs.
/// </summary>
public class TestDialogContext
{
public bool ShouldShowSecondDialog { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.