在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属性也感觉有点奇怪。
干杯
编辑:
我应该澄清的是,这种观点不仅仅显示繁忙的状态。它允许取消/重试和选择不同的网络资源等。为了简洁起见,我省略了这些细节,这可能是一个错误,因为人们正专注于繁忙指示器。
我总是只使用Silverlight Toolkit中的BusyIndicator
。它没有一个取消按钮,但你可能可以把它设计成有一个。BusyIndicator
有一个IsBusy
属性,我将其绑定到ViewModel上的IsBusy
属性。如果将控件样式设置为具有按钮,则可以将取消命令添加到ViewModel中。
编辑
我刚刚看到这是WPF而不是Silverlight。我不确定WPF工具包是否有BusyIndicator
再次编辑
看起来Extended WPF Toolkit有一个BusyIndicator。注意,我没有这方面的经验。
我会赞同你在A)中的建议,并认为在你真正拥有这种程度的灵活性作为需求之前,你不应该实现像B)这样的泛型,比如能够显示不同的覆盖视图。
保持简单!