2012-01-13 44 views
2

我正在编写一个连接到网络资源的应用程序。在MVVM中实现临时覆盖的最佳方法

当应用程序连接时,我想弹出一个覆盖图,其中包含通常的spinkin进度图形和取消按钮。我设计了一个ConnectProgressViewModel和匹配ConnectProgressView的覆盖。

我的问题是什么是最清洁的方式来显示/隐藏父视图模型的覆盖?

A)暴露从我父视图模型常数ConnectProgressViewModel,并有ConnectProgressView其知名度绑定到ConnectProgressViewModel.IsConnecting财产。

B)暴露从父视图模型的通用Overlay财产,它当用户想要连接设置为ConnectProgressViewModel。父视图将ContentControl绑定到此Overlay属性,数据模板处理其余部分。

C)

第一个似乎封装功能更多,与应用程序不必关心显示和隐藏覆盖,但暴露一个常数ConnectProgressViewModel时感觉不对,只是偶尔显示。

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

干杯

编辑:

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

回答

1

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

编辑

我刚才看到的,这是不是WPF的Silverlight。我不知道如果WPF工具包具有BusyIndi​​cator控件

再次编辑

它看起来像Extended WPF Toolkit有BusyIndi​​cator控件。请注意,我没有这方面的经验。

+0

但是,如何显示/隐藏BusyIndi​​cator? – GazTheDestroyer 2012-01-13 14:29:47

+0

BusyIndi​​cator在IsBusy为true时自动显示,当IsBusy为false时会自动显示。 – cadrell0 2012-01-13 14:30:58

+0

是的,只是看了一下WPF Toolkit版本,谢谢。它似乎在所有的时间,并显示/隐藏自己像我的A)。 – GazTheDestroyer 2012-01-13 14:33:25

1

我会用类似于你在A)的建议去解决问题,并且认为你不应该像B一样实现一些通用的东西),直到你真正具有这种灵活性作为一个需求,就像能够显示不同的覆盖视图一样。

保持简单!