在MVVM中实现临时覆盖的最佳方式

本文关键字:覆盖 最佳 方式 MVVM 实现 | 更新日期: 2023-09-27 18:20:17

我正在编写一个连接到网络资源的应用程序。

当应用程序连接时,我想弹出一个覆盖图,上面有通常的微调进度图和一个取消按钮。我为覆盖设计了一个ConnectProgressViewModel和匹配的ConnectProgressView

我的问题是,向父ViewModel显示/隐藏覆盖的最干净的方法是什么?

A)从父ViewModel中公开常量ConnectProgressViewModel,并使ConnectProgressView将其可见性绑定到ConnectProgressViewModel.IsConnecting属性。

B)从父ViewModel中公开通用Overlay属性,并在用户想要连接时将其设置为ConnectProgressViewModel。父视图将一个ContentControl绑定到这个Overlay属性,其余部分由数据模板处理

C)

第一个似乎更多地封装了功能,应用程序不必关心显示和隐藏覆盖,但当它只是偶尔显示时,总是暴露一个常量ConnectProgressViewModel会让人感觉不对劲。

第二个似乎更适合MVVM,ConnectProgressViewModel只在需要的时候创建,但它将更多的功能放在了父级上,而且通用的Overlay属性也感觉有点奇怪。

干杯

编辑:

我应该澄清的是,这种观点不仅仅显示繁忙的状态。它允许取消/重试和选择不同的网络资源等。为了简洁起见,我省略了这些细节,这可能是一个错误,因为人们正专注于繁忙指示器。

在MVVM中实现临时覆盖的最佳方式

我总是只使用Silverlight Toolkit中的BusyIndicator。它没有一个取消按钮,但你可能可以把它设计成有一个。BusyIndicator有一个IsBusy属性,我将其绑定到ViewModel上的IsBusy属性。如果将控件样式设置为具有按钮,则可以将取消命令添加到ViewModel中。

编辑

我刚刚看到这是WPF而不是Silverlight。我不确定WPF工具包是否有BusyIndicator

再次编辑

看起来Extended WPF Toolkit有一个BusyIndicator。注意,我没有这方面的经验。

我会赞同你在A)中的建议,并认为在你真正拥有这种程度的灵活性作为需求之前,你不应该实现像B)这样的泛型,比如能够显示不同的覆盖视图。

保持简单!