c# - ViewModel 是否应该公开诸如 BitmapImage 或 ImageSource 或音频文件缓冲区之类的东西?

标签 c# wpf mvvm caliburn.micro

View Model 应该公开加载的位图图像(BitmapImage 类)还是应该只提供文件名并让 WPF 控件加载图像或加载音频文件等。

View Model 在 MVVM 设计模式中的作用是正确的。

我问这个问题的原因是,如果允许 WPF 控件从本地存储加载图像,应用程序将很难监视正在使用的文件。

编辑: 当应用程序管理其文件资源(WinRT 或 WindowsPhone 应用程序)时会出现问题。当 WPF 控件加载文件时,应用程序无法管理文件资源,并且应用程序将间接依赖于 WPF 控件的生命周期,因为在 WPF 控件释放文件之前无法删除或修改文件。

此外,像 caliburn Micro 这样的框架也没有代码隐藏的概念。那么这些情况应该如何处理呢? 谢谢

最佳答案

就我个人而言,我喜欢将 URI 暴露给 View 模型中的图像(或资源)。

这有助于避免不良习惯 - 当您的团队时间紧迫时,很容易开始让不良代码(例如 UI 引用)滑入不应出现的位置。

因此,将图像或音频文件视为资源并为其提供 URI - 然后 View 可以绑定(bind)到它并以它认为合适的任何方式公开它。

也没有理由说明 View 中的代码无法通过 View 的 DataContext 访问公开的 URI。我总是让我的 View 模型实现一个特定于它们的接口(interface)(即 ViewModelA 将实现 IViewModelA),然后任何时候 View 中的一些代码需要访问它通过接口(interface)访问 View 模型,例如:

var myAudioUri = ((IViewModelA) DataContext).ThatAudioUri;

关于c# - ViewModel 是否应该公开诸如 BitmapImage 或 ImageSource 或音频文件缓冲区之类的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20718746/

相关文章:

c# - Azure 服务总线上的主题 DefaultMessageTimeToLive 和订阅 DefaultMessageTimeToLive 之间的区别

c# - 从代码访问 MVVM Light ViewModelLocator

silverlight - 在设计模式下将数据上下文绑定(bind)到另一个 View 模型

c# - MVC 5 EF 6 TPT 和 ViewModel

c# - 检查 session 对象,以便用户不会跳过表单中的步骤

c# - 如何检查数据库是否存在?

c# - 将 Silverlight 转换为 MVVM,几个问题

c# - MVVM中的实时UI和LiveCharts更新

c# - 更改我的 wpf 应用程序的语言

c# - MVVM灯下的异步命令执行