在MVVM中实现临时叠加层的最佳方法

时间:2012-01-13 14:14:21

标签: c# wpf mvvm popup overlay

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

当应用程序连接时,我想使用通常的spinney进度图形和取消按钮弹出叠加层。我为叠加设计了ConnectProgressViewModel并匹配ConnectProgressView

我的问题是从父ViewModel显示/隐藏叠加层的最简洁方法是什么?

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

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

C)

第一个似乎更多地封装了功能,应用程序不必关心显示和隐藏叠加层,但是只有偶尔显示时才会出现常量ConnectProgressViewModel感觉错误。

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

干杯

编辑:

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

2 个答案:

答案 0 :(得分:1)

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

修改

我刚看到这是WPF而不是Silverlight。我不确定WPF Toolkit是否有BusyIndi​​cator

再次编辑

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

答案 1 :(得分:1)

我会在A)中提出类似你的建议,并认为你不应该像B)那样实现通用的东西,直到你真正具备这种程度的灵活性作为要求,比如能够显示不同的叠加视图。 / p>

保持简单!