4

跟进 IDialogService 方法:

System.Windows.MessageBoxResult枚举呢?将其排除在接口之外并仅将其包含在实现中的更好方法是什么?

我为System.Windows.MessageBoxResult枚举选择的方法:

我在 IDialogInterface 旁边添加了一个枚举,包括 Yes、NO、Ok、Cancel:

namespace Foo.Bar.Dialogs
{
    public enum DialogResult { Ok, Yes, No, Cancel }

    public interface IDialogService
    {
        void ShowErrorBox(string error_message);

        DialogResult ShowQuestionBox(string question_message);

        DialogResult ShowQuestionBox(string question_message, string caption);

        DialogResult ShowQuestionBox(string question_message, string caption, bool allow_cancel);

        DialogResult ShowQuestionBox(string question_message, string caption, bool allow_cancel, bool show_as_error);

        void ShowWarningBox(string message, string caption = "");

        void ShowInformationBox(string message);

        void ShowInformationBox(string message, string caption);
    }
}

最初的问题:

我正在将所有命令从我的 .asmx.cs 文件移动到某个应用程序主窗口的 ViewModel 中。

现在我必须弄清楚如何处理要求用户确认的命令。

现在我只需要在我的 ViewModel 中引入必要的类型来直接启动我的对话框。我很确定这不是最好或最干净的方法。

我发现这篇文章采用了一种有趣且更简洁的方法。它使用 IDialogService 接口:

public interface IDialogService
{
    int Width { get; set; }
    int Height { get; set; }
    void Show(string title, string message, Action<DialogResult> onClosedCallback);
}

我还发现这篇文章似乎更好,因为它在尝试使用之前检查 IDialogInterface 是否为空:

private void PerformAddNewCustomer() 
{ 
    CustomerList.Add(new Customer { Name = "Name" + i }); 
    i++; 

    if (dialogService != null) 
    { 
        dialogService.Show("Customed added"); 
    } 
} 

这是将对话框与 ViewModel 分开的最佳方法,还是有更好的方法?

4

2 回答 2

1

我会说您发布的链接中的方法是一种很好的方法,并且非常普遍(来源:我正在查看网络上的代码;))。它使用起来相当简单,它通过在单元测试中使用虚拟服务使对话框可测试,并简化了重构对话框的过程。

就个人而言,我的DialogService方法签名需要一个列表,Tuple<string, Action>并基于该列表创建对话窗口的按钮。它允许ViewModel从对话窗口请求一些特殊功能,而不必每次我的需要不仅仅是一个OkYesNo消息框时向我的服务添加新方法(而我确实将这些方法作为方法单独使用以方便使用)。

所以这是一种可靠的方法,在这一点上,我认为你不会找到更好的东西,只有你可能更个人喜欢的东西。

于 2012-04-06T10:28:12.923 回答
0

您发现的文章是处理 MVVM 中对话窗口的好方法,它确实可重用,并且使用 DI 很容易在您的视图中使用。

我确实使用了不同的东西,大多数时候我使用 MVVM 轻工具包,它有一个信使,我使用信使向一个单独的类发送消息,然后它为我打开了我想显示的对话框,结果是回消息,以便我可以根据用户的选择采取行动。

于 2012-04-06T10:20:33.310 回答