C# 使用本地/匿名操作时未触发MvvmLight消息
当我使用匿名操作时,MvvmLight messenger有时无法工作。如果我将一个成员变量或方法作为操作传递,它可以正常工作,但使用匿名lambda或局部变量不起作用C# 使用本地/匿名操作时未触发MvvmLight消息,c#,mvvm-light,C#,Mvvm Light,当我使用匿名操作时,MvvmLight messenger有时无法工作。如果我将一个成员变量或方法作为操作传递,它可以正常工作,但使用匿名lambda或局部变量不起作用 private SongCollection songCollection; Action<bool> c; public MyService(SongCollection songCollection) { this.songCollection = songColl
private SongCollection songCollection;
Action<bool> c;
public MyService(SongCollection songCollection)
{
this.songCollection = songCollection;
Action<bool> a = (bool isLoading) =>
{
ChangeSong(songCollection.GetFirstSong());
};
Action<bool> b = OnLoadingComplete; //Using this instead of 'a' works.
//c = a; //Uncommenting this line makes it work, even if using 'a'.
Messenger.Default.Register<bool>(this, "IsLoading", a); //Doesn't work.
}
私人歌曲集歌曲集;
行动c;
公共MyService(SongCollection SongCollection)
{
this.songCollection=songCollection;
动作a=(布尔isLoading)=>
{
ChangeSong(songCollection.GetFirstSong());
};
操作b=OnLoadingComplete;//使用此选项而不是“a”可以工作。
//c=a;//取消注释这一行可以使它工作,即使使用“a”。
Messenger.Default.Register(这个“IsLoading”,a);//不起作用。
}
我猜这与垃圾收集或MvvmLight在幕后的工作方式有关。还是我遗漏了一些明显的东西
我正在.Net4.0上使用MvvmLight版本
4.3.31.1
。您的代码对我来说很好(使用与您相同的版本--.NET 4.0和MvvmLight 4.3.31.1)。当使用“a”时,一定是有什么原因导致您的MyService
被垃圾收集,而不是在使用“b”或“c”时。但是我想不出会是什么。onload complete和DoSomething的定义是什么?两者都是一样的:ChangeSong(songCollection.GetFirstSong())
但是两个中的断点都不会被命中。该服务被大量使用,因此不应该被垃圾收集。与构造函数中的局部变量不同,使用“c”是因为MyService中的引用是保留的。如果没有messenger执行操作,我希望本地变量被垃圾收集。这些方法是公共的、私有的还是受保护的?