C# MVVMLight toolkit Messenger类导致问题。射击N次
我有一个名为Work.xaml的视图。此Work.xaml包含多个WorkSkeleton.xaml。xaml的ViewModel是WorkViewModel Work.xaml包含在MainPage.xaml中,MainPage.xaml中有加载Work.xaml的按钮。我希望我到现在都清楚了。按钮的事件处理程序很简单:-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) {
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,它成功了。谢谢