【发布时间】:2016-06-22 14:52:10
【问题描述】:
我最近开始学习 WPF,这使我了解了 MVVM 并最终了解了 MVVM Light,因此仍然是这三个方面的初学者。我正在构建一个布局类似于链接中图片的应用程序 -> Application layout
为了保持良好的代码分离并避免大文件,我决定最好的方法是创建一个主 View,并在其中创建几个较小的 View 每个“ UI 的区域”。根据我在几个教程中阅读的内容,建议为每个 View 维护 1 个 ViewModel。因此,我有一个 Master View / ViewModel,并且有几个 View / ViewModels 同时运行。
最后我有一个单独的模型来跟踪我计划在 UI 中显示的信息。 Model 与可以修改其中数据的外部 API 交互。因此,除了用户请求修改数据(例如:按下按钮或计时器)外,数据也会随着来自 API 的异步事件而改变。这意味着我需要在 Model 和 ViewModels / Views 之间进行双向通信。
问题:
1.您是否同意“每个 UI 区域 1 个视图”?每个 View 有 1 个 ViewModel?
2. 在 Main View-Code-Behind 中,我实例化所有 ViewModel,并在每个 View 中绑定它们,就像在我看到的 MVVM Light 示例中一样:
<UserControl ... DataContext="{Binding Main, Source={StaticResource Locator}}">
<UserControl ... DataContext="{Binding SideBar, Source={StaticResource Locator}}">
<UserControl ... DataContext="{Binding TopBar, Source={StaticResource Locator}}">
这是将多个 ViewModel 实例化并绑定到各自 View 的正确方法吗?
3. 每个 ViewModel 都在其构造函数中传递了对 Main ViewModel(Main ViewModel 本身除外)的引用,这是唯一一个对 Model 的引用。这就是我将几个 ViewModel 连接到模型的方式。这在概念上是否正确?
4. 最初我试图避免使用 MVVM Light 或其他框架,如果我可以使用 RaisePropertyChanged 方法做我想做的所有事情。我可能做错了什么,但是例如,当模型调用 RaisePropertyChanged 时,我可以在主 ViewModel 中捕获该事件,但是它不会传播到其余的 ViewModel,所以我必须自己调用 RaisePropertyChanged第二次:
public MountainTopViewModel()
{
_model = new MachineStatusModel();
_model.PropertyChanged += ModelPropertyChanged;
}
void ModelPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "TestVarModel")
{
// do something else if needed
RaisePropertyChanged("TestVar");
}
}
我猜这要么不是正确的方法,要么有更好的方法。那么如何在 Model 中的属性发生变化时通知所有 View 和 ViewModel,而不必在不同的地方重新调用方法呢?
对不起,说来话长,我将不胜感激。
【问题讨论】:
标签: c# wpf mvvm mvvm-light