2

我是 MVVM 的新手,我被卡住了......

我在 MainWindow 中有一个 ListBox。ListBox 包含由 DataTemplates 显示的 WhatEverViewModel 类型的项目。用户可以与这些项目进行交互,并且 WhatEverViewModel 有几个 DependencyProperties,它们可能会在交互过程中发生变化。

我的问题是:如何优雅地(在 MainWindowViewModel 中)对当前选择的 WhatEverViewModel 的 DependencyProperties 的变化做出反应。我个人会在 WhatEverViewModel 中实现一些事件,当 ListBox 的 SelectedItem 发生变化时,我会附加到当前选择的 WhatEverViewModel 的事件上。但我认为在 MVVM 中可能有更优雅的方法来解决这个问题......

谢谢你。

4

3 回答 3

2

viewmodel 之间的通信可以通过多种方式完成。

  • 像MVVM Light的一种形式的 Messenger/Mediator
  • PRISM这样的事件
  • 或者简单地使用 harcoupling 并订阅来自 mainviewmodel 中 WhatEverViewModel 的事件。

顺便说一句,为什么在你的视图模型中使用 DependencyProperties?使用 INotifyPropertyChanged 的​​简单属性是可行的方法。

还有一件事。为什么要对 SelectedViewmodel 中的更改做出反应(或者更好地使用所选视图模型来实现您想要实现的目标。)?如果您只想在视图中显示一些信息,只需将 SelectedViewmodel 绑定到它。您应该以这种方式指定您的问题。

编辑

WhatEverViewModel 有一个列表,该列表也绑定到列表框(在数据模板中),并且根据我在 WhatEverViewModel 中选择的内容,我想在 MainViewModel 中显示某种“配置器”。– JensPfister1 1 小时前

为什么不简单地将 SelectedWhatEverViewmodel.SelectedListEntryProperty 绑定到您的配置器视图?你可以发布一些代码吗?

于 2012-04-26T09:54:40.593 回答
2

Make CurrentWhatEver a property of your MainWindowViewModel and bind the Listbox.SelectedItem property on it. This way, MainWindowViewModel knows when the selected WhatEver changes and can register/unregister to events it's interested in.

于 2012-04-26T09:44:50.643 回答
0

You should implement the INotifyPropertyChanged interface on each of your ViewModels. Then when one of your properties changes call the PropertyChanged event, your views will get notifications that the property has changed (as long as your Binding is correct). If a property is a list or collection make sure that the list is based off an INotifyCollectionChanged.

Add a property for the Selected WhatEverViewModel to your MainWindowViewModel, bind that in your ListBox. Then in your MainWindowViewModel you can hook on to the property changes of your Selected WhatEverViewModel.

For more guidance read:

于 2012-04-26T09:43:40.887 回答