我正在写一个连接网络资源的应用程序。
当应用程序正在连接时,我想弹出一个带有通常的棘突进度图形和取消按钮的覆盖图。我已经为覆盖设计了一个ConnectProgressViewModel
和匹配的ConnectProgressView
。
我的问题是从父ViewModel显示/隐藏叠加层的最干净方法是什么?
A)从我的父级ViewModel中公开一个恒定的ConnectProgressViewModel
,并使ConnectProgressView
将其可见性绑定(bind)到ConnectProgressViewModel.IsConnecting
属性。
B)从父ViewModel公开通用的Overlay
属性,并在用户想要连接时将其设置为ConnectProgressViewModel
。父 View 将ContentControl
绑定(bind)到此Overlay
属性,数据模板处理其余工作。
C)吗?
第一个似乎更多地封装了功能,应用程序不必关心显示和隐藏叠加层,但是始终仅公开显示恒定的ConnectProgressViewModel
总是感觉不对。
第二个似乎更适合MVVM,只有在需要时才创建ConnectProgressViewModel
,但是它将更多功能放到父级上,并且通用的Overlay属性也有点怪异。
干杯
编辑:
我要澄清的是,此 View 不仅仅显示繁忙状态。它允许取消/重试以及选择不同的网络资源等。为简洁起见,我省略了此类详细信息,这可能是一个错误,因为人们将注意力集中在繁忙的指示器上。
最佳答案
我总是只使用Silverlight工具包中的BusyIndicator
。它没有取消按钮,但是您可以将其样式化为一个。 BusyIndicator
具有IsBusy
属性,我将其绑定(bind)到ViewModel上的IsBusy
属性。如果将控件设置为具有按钮的样式,则可以将取消命令添加到ViewModel。
编辑
我只是看到这是WPF而不是Silverlight。我不确定WPF工具包是否有BusyIndicator
再次编辑
看来Extended WPF Toolkit有一个BusyIndicator。注意,我对此没有经验。
关于c# - 在MVVM中实现临时覆盖的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8851878/