我花了两天时间试图解决这个问题。
我已经实现了两种使用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();
在第一种方法中,服务的用户应该知道视图的类型,视图模型和能够显示对话框的结果
在第二个界面中简化了一点,但我仍然必须知道在使用之前将结果转换为什么类型。
您是否遇到过显示视图模型对话框的问题?
如何改进窗口服务的设计?
您能举例说明对话服务的良好实现吗?
答案 0 :(得分:7)
我建议您查看User Interaction Patterns,因为它介绍了处理MVVM中用户交互的不同方法。使用interaction service的替代方法是实现interaction request object。
另一种实施方法 MVVM中的简单用户交互 模式是允许视图模型 直接向交互请求发送 视图本身通过交互 请求对象与行为相结合 在视图中。交互请求 对象封装了细节 交互请求及其响应, 并通过视图与视图进行通信 事件。视图订阅了这些 用于启动用户体验的事件 交互的一部分。风景 通常会封装用户 体验互动的经验 数据绑定到的行为 交互请求对象提供 视图模型。
这种方法提供了一个简单的方法 灵活的,保持机制 清晰的视图之间的分离 模型和视图 - 它允许视图 模型来封装应用程序 表示逻辑,包括任何 需要用户交互,而 允许视图完全封装 互动的视觉方面。 视图模型的实现, 包括其预期的相互作用 用户通过查看,即可 容易测试,UI设计师 选择方式有很大的灵活性 实现内部的互动 通过使用不同的视图 封装的行为 不同的用户体验 相互作用。
有关如何实现此功能的示例,我建议您查看Prism 4 library源代码及其示例。 Prism库通过IInteractionRequest接口和InteractionRequest类支持此模式。 IInteractionRequest接口定义了一个事件来启动交互,而视图中的行为绑定到此接口并订阅它公开的事件。
您可以使用 Microsoft.Practices.Prism.Interactivity 程序集中定义的类和接口,或使用这些类型作为实现对话服务的基础。