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

标签 c# wpf mvvm popup overlay

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

当应用正在连接时,我想弹出一个带有通常的 spinney 进度图形和一个取消按钮的叠加层。我设计了一个ConnectProgressViewModel和匹配 ConnectProgressView用于覆盖。

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

A) 暴露常量 ConnectProgressViewModel来 self 的 parent ViewModel,并拥有 ConnectProgressView将其可见性绑定(bind)到 ConnectProgressViewModel.IsConnecting属性(property)。

B) 公开一个通用的 Overlay来自父 ViewModel 的属性,并将其设置为 ConnectProgressViewModel当用户想要连接时。父 View 绑定(bind)一个 ContentControl对此Overlay属性和数据模板负责其余的工作。

C) ?

第一个似乎更多地封装了功能,应用程序不必关心显示和隐藏叠加层,而是公开常量 ConnectProgressViewModel当它只是偶尔出现时,总是感觉不对。

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

干杯

编辑:

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

最佳答案

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

编辑

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

再次编辑

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

关于c# - 在 MVVM 中实现临时覆盖的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8851878/

相关文章:

c# - 将集合初始值设定项与插入语句一起使用

c# - Borderbrush 到 ComboBox

wpf - 如何在 XAML 中将颜色转换为画笔?

android - 使用MVVM和翻新不会获取任何数据

c# - 如何将 WEP key 转换为 ASCII 密码?

c# - ApplicationInsightDataClient GetCustomEventWithHttpMessageAsync 未加载自定义维度

c# - 如何使特定的树节点在 TreeView 中显示为文件夹

c# - 如何摆脱 Visual Studio 中的 "[some event] never used"编译器警告?

.net - Silverlight 4 + MVVM + KeyDown 事件

c# - 如何从 View 模型中触发对 View 中对象的方法调用