在ViewModel中处理对话框的最佳方法是什么?

时间:2012-04-06 10:11:39

标签: c# wpf mvvm

跟进IDialogService方法:

System.Windows.MessageBoxResult枚举怎么样?更好的方法是将其保留在界面之外并仅将其纳入实现中吗?

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

我在IDialogInterface旁边添加了一个enum,其中包含Yes,NO,Ok,取消:

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中填入必要的类型来直接启动我的对话框。我很确定这不是最好的或最干净的方法。

我发现这个article有一个有趣而清洁的方法。它使用IDialogService接口:

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

我还发现这个article看起来更好,因为它在尝试使用之前检查IDialogInterface是否为null:

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

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

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

2 个答案:

答案 0 :(得分:1)

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

就个人而言,我的DialogService方法签名采用Tuple<string, Action>列表,并根据该列表创建对话窗口的按钮。它允许ViewModel从对话框窗口请求一些特殊功能,而不必在每次我的需求超过OkYesNo消息框时向我的服务添加新方法(同时为了方便起见,我确实将它们作为方法使用了。)

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

答案 1 :(得分:0)

您找到的文章是处理MVVM中对话框窗口的一种很好的方法,它实际上是可重用的,使用DI可以很容易地在您的视图中使用。

我确实使用了不同的东西,大部分时间我都使用MVVM光工具包,它有一个信使,我使用信使向一个单独的类发送消息然后它为我打开了我想要显示的对话框,并且结果会被回复,以便我可以根据用户的选择采取行动。