【问题标题】:Mvvm popup window with view model, parameter and result带有视图模型、参数和结果的 Mvvm 弹出窗口
【发布时间】:2011-09-10 15:31:43
【问题描述】:

我花了两天时间试图弄清楚。

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

第一种方法用法示例:

_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();

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

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

你有没有遇到过用视图模型显示对话框的问题?

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

你能举一个很好的对话服务实现的例子吗?

【问题讨论】:

    标签: c# silverlight design-patterns mvvm


    【解决方案1】:

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

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

    这种方法提供了一个简单但 灵活的机制,保留一个 视图之间的干净分离 模型和视图——它允许视图 封装应用程序的模型 表示逻辑,包括任何 所需的用户交互,而 允许视图完全封装 交互的视觉方面。 视图模型的实现, 包括其预期的相互作用 与用户通过视图,可以 易于测试,并且 UI 设计师已经 在选择方式上有很大的灵活性 实现内部的交互 通过使用不同的视图 封装的行为 不同的用户体验 互动。

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-23
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多