从 View 向 ViewModel 发送消息:什么是合适的令牌?

2024-04-16

让我们定义:

  • 视图模型: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 实例是一个不错的选择吗?如果使用它,如何防止内存泄漏?


编辑:可能的解决方案


Token 是 View 传递给 ViewModel 的对象唯一值,它们都使用相同的 Token。喜欢

View

public partial class MainWindow : Window
{
    readonly string Token;
    public MainWindow()
    {
        Token = Guid.NewGuid().ToString();
        InitializeComponent();
        DataContext = new MainViewModel(Token);
    }
}

视图模型

public class MainViewModel 
{
    readonly string Token;

    public MainViewModel(string token)
    {
        Token = token;
    }
}

实际上,Token 背后的逻辑是,当我们向 Messenger 注册一个委托时,它确实有内部字典,并且这个 Token 充当该字典中的键。View 及其 ViewModel 必须具有相同的 Token,以便可以在 Send 方法上触发与该键对应的确切委托。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 View 向 ViewModel 发送消息:什么是合适的令牌? 的相关文章

随机推荐