MVVMLight 工具包 导致问题的信使类.发射N次

本文关键字:发射 信使 工具包 问题 MVVMLight | 更新日期: 2023-09-27 17:56:54

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

Work.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);
        }

在我的 Work.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);
            }
        }
    });

当可观察集合加载时,ViewModel 会发送此消息,如下所示:-

 Messenger.Default.Send<ObservableCollection<WorkEducation>>(WorkEducation,
                    "BindWorkEducationList");

第一次一切都很好。但是,一旦我单击 MainPage.xaml 中的"工作"按钮以第 2 次加载工作页面,就会在我的 Work.xaml 中收到 2 次消息,这会一次又一次地将相同的项目添加到堆栈面板。这种情况发生了N次。如果我第 N 次单击按钮,该消息将在 Work.xaml.cs 中收到 N 次。但这怎么可能呢?

我已经明确指定了 Work.xaml 中的接收.cs作为第一个参数this,这意味着要为此特定实例接收消息。单击"工作"按钮时,实例是全新的。那为什么它要开火N次呢?

MVVMLight 工具包 导致问题的信使类.发射N次

您确定它针对同一实例触发了 N 次吗?您可能有 N 个实例(N-1 个等待被垃圾回收),这就是为什么您看到它 N 次的原因。