让我们定义:
- 视图模型:
TabViewModel
class
- 一个观点:
TabView
class
I have n的实例TabView
类,等等n的实例TabViewModel
。
当一个实例TabView
类发送一条消息,我希望它被它自己的视图模型接收,并且只有这一个.
据我了解 mvvm light 工具包的 Messenger,我应该使用类似的东西:
// in the view
Messenger.Default.Send(new RefreshMessage(/*...*/), oneToken);
and
// in the viewmodel
Messenger.Default.Register<RefreshMessage>(this, oneToken, MyViewModelMethod);
我应该用来做什么oneToken
?
我的第一个想法是使用 ViewModel 实例作为令牌:
// in the view
Messenger.Default.Send(new RefreshMessage(/*...*/), this.DataContext);
and
// in the viewmodel
Messenger.Default.Register<RefreshMessage>(this, **this**, MyViewModelMethod);
这对我来说似乎“mvvm 友好”,因为视图不知道 DataContext 是什么。
但使用这个解决方案,我担心内存泄漏:在 mvvm 的光下,接收者是弱引用的,但令牌不是(正如您将在Messenger 类的 WeakActionAndToken 结构 http://bit.ly/1cPxMyV.
我可以使用什么作为令牌? viewmodel 实例是一个不错的选择吗?如果使用它,如何防止内存泄漏?
编辑:可能的解决方案