C# MVVMLight toolkit Messenger类导致问题。射击N次

C# MVVMLight toolkit Messenger类导致问题。射击N次,c#,silverlight,silverlight-4.0,mvvm,mvvm-light,C#,Silverlight,Silverlight 4.0,Mvvm,Mvvm Light,我有一个名为Work.xaml的视图。此Work.xaml包含多个WorkSkeleton.xaml。xaml的ViewModel是WorkViewModel Work.xaml包含在MainPage.xaml中,MainPage.xaml中有加载Work.xaml的按钮。我希望我到现在都清楚了。按钮的事件处理程序很简单:- private void hypMyWork_Click(object sender, RoutedEventArgs e) {

我有一个名为Work.xaml的视图。此Work.xaml包含多个WorkSkeleton.xaml。xaml的ViewModel是WorkViewModel

Work.xaml包含在MainPage.xaml中,MainPage.xaml中有加载Work.xaml的按钮。我希望我到现在都清楚了。按钮的事件处理程序很简单:-

 private void hypMyWork_Click(object sender, RoutedEventArgs e)
        {
            ShowGridContent(new Work());
        }

 private void ShowGridContent(UserControl control)
        {
            gridContent.Children.Clear();
            gridContent.Children.Add(control);
        }
在我的工作.xaml.cs的构造函数中,我注册了ObservableCollection类型的消息:

    Messenger.Default.Register<ObservableCollection<WorkEducation>>(this, "BindWorkEducationList", collection =>
    {
        foreach (var item in collection)
        {
            if (item.IsEducationInfo == false)
            {
                WorkEducationSkeleton skeleton = new WorkEducationSkeleton();
                skeleton.WorkEducation = item;
                stkPanel.Children.Insert(0,skeleton);

            }
        }
    });
Messenger.Default.Register(此“BindWorkEducationList”,集合=>
{
foreach(集合中的var项)
{
如果(item.IsEducationInfo==false)
{
WorkEducationSkeleton骨架=新的WorkEducationSkeleton();
skeleton.WorkEducation=项目;
stkPanel.Children.Insert(0,骨架);
}
}
});
加载ObservableCollection时,ViewModel将发送此消息,如下所示:-

 Messenger.Default.Send<ObservableCollection<WorkEducation>>(WorkEducation,
                    "BindWorkEducationList");
Messenger.Default.Send(工作教育、,
“BindWorkEducationList”);
第一次一切正常。但是,当我单击MainPage.xaml中的Work按钮第二次加载工作页面时,我的Work.xaml中会收到两次消息,这会一次又一次地将相同的项目添加到stackpanel中。这种情况发生了N次。如果我第N次单击按钮,则消息将在Work.xaml.cs中收到N次。但这怎么可能呢


我已经清楚地将Work.xaml.cs中的recepient指定为
this
,作为第一个参数,这意味着将针对该特定实例接收消息。单击“工作”按钮时,实例是全新的。那么为什么它要发射N次呢?

你确定它在同一个实例中发射N次吗?您可能有N个实例(N-1个等待垃圾收集),这就是为什么您会看到它N次。

很抱歉,这不是Messenger类的问题。在进一步的调查中,我发现我的viewmodel本身正在多次调用,这就是为什么消息会触发N次。我现在需要检查我的视图模型。这很可能是真正的原因。请记住,弱引用并不意味着收件人将自动注销。若要确保干净的工作流,应在视图停用时添加“注销”工作流。我在导航应用程序中遇到了相同的问题。多次收到移动到不同页面和返回原始页面的消息。正如Laurent建议的那样,我“注销”了messenger,它成功了。谢谢