Mvvm弹出窗口与视图模型,参数和结果

时间:2011-06-08 07:13:04

标签: c# silverlight design-patterns mvvm

我花了两天时间试图解决这个问题。

我已经实现了两种使用mvvm弹出窗口的方法

第一次使用aproach的示例:

_childWindowController
                .ShowDialogWithResult<AddNationalityPopup,AddNationalityPopupModel, AddNationalityResult>(
                    (result, a) =>
                    {
                        if (a.DialogResult.HasValue && a.DialogResult.Value)
                        {
                            if (result.NationalityCountryId.HasValue)
                            {
                                Background.NationalityCountryId = result.NationalityCountryId.Value;
                                Background.NationalityDescription = result.NationalityDescription;
                            }
                        }
                    });

第二种方法:

var window = _childWindowController.CreateDialog<AddNationalityPopup>();

    window.Closed += (sender, args) =>
    {
        if (args.DialogResult.HasValue && args.DialogResult.Value)
        {
            var result = (AddNationalityResult)window.Result;
            if (result.NationalityCountryId.HasValue)
            {
                Background.NationalityCountryId = result.NationalityCountryId.Value;
                Background.NationalityDescription = result.NationalityDescription;
            }
        }
    };

    window.ShowDialog();

在第一种方法中,服务的用户应该知道视图的类型,视图模型和能够显示对话框的结果

在第二个界面中简化了一点,但我仍然必须知道在使用之前将结果转换为什么类型。

您是否遇到过显示视图模型对话框的问题?

如何改进窗口服务的设计?

您能举例说明对话服务的良好实现吗?

1 个答案:

答案 0 :(得分:7)

我建议您查看User Interaction Patterns,因为它介绍了处理MVVM中用户交互的不同方法。使用interaction service的替代方法是实现interaction request object

  

另一种实施方法   MVVM中的简单用户交互   模式是允许视图模型   直接向交互请求发送   视图本身通过交互   请求对象与行为相结合   在视图中。交互请求   对象封装了细节   交互请求及其响应,   并通过视图与视图进行通信   事件。视图订阅了这些   用于启动用户体验的事件   交互的一部分。风景   通常会封装用户   体验互动的经验   数据绑定到的行为   交互请求对象提供   视图模型。

     

这种方法提供了一个简单的方法   灵活的,保持机制   清晰的视图之间的分离   模型和视图 - 它允许视图   模型来封装应用程序   表示逻辑,包括任何   需要用户交互,而   允许视图完全封装   互动的视觉方面。   视图模型的实现,   包括其预期的相互作用   用户通过查看,即可   容易测试,UI设计师   选择方式有很大的灵活性   实现内部的互动   通过使用不同的视图   封装的行为   不同的用户体验   相互作用。

有关如何实现此功能的示例,我建议您查看Prism 4 library源代码及其示例。 Prism库通过IInteractionRequest接口和InteractionRequest类支持此模式。 IInteractionRequest接口定义了一个事件来启动交互,而视图中的行为绑定到此接口并订阅它公开的事件。

您可以使用 Microsoft.Practices.Prism.Interactivity 程序集中定义的类和接口,或使用这些类型作为实现对话服务的基础。