繁体   English   中英

MVVM多对话框令人头疼

[英]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。 但这也有问题。 在停用事件回调中,如果我愿意,我无法关闭所有功能! 因为它保留在内存中,所以触发了“停用”后的下一个引用,即使您清除它,它也会再次出现。

如何在对话框之间移动时使用类来跟踪状态信息,而不是像原始示例中那样嵌套闭包?

我认为您走在正确的道路上,但是似乎您有两个问题:

  1. 您正在进行的嵌套数量不足以使代码清晰。
  2. 您需要一种更好的方法来捕获对话框之间的局部变量和状态信息。

为了解决第一个问题,我建议将您的逻辑分解为不同的方法。 每次停用对话框时,您都可以使用一种方法来处理随后应执行的逻辑。

要解决第二个问题,您可以尝试创建一个类,该类负责存储要在对话框之间传递的信息。 此类的实例可以作为参数传递给将在停用对话框后执行的每个方法。

这是完成此操作的方法:

导体类

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM