2014-10-01 4 views
1

Im, использующий MVVM Light Messenger в моем приложении WPF, и что-то не работает должным образом.MVVM Light Messeging issue

модель моего вида с маркером. im, используя «длинные» объекты в качестве токенов. мой код зарегистрирован, например, с токеном 5, а затем отправляет запрос службе. , когда служба отвечает за ее обработку в моей второй модели представления, которая затем отправит сообщение с тем же токеном.

Когда я отлаживаю и печатаю регистрацию и отправку сообщений, это кажется ОК, но по некоторым причинам не все мессенджеры принимаются зарегистрированным.

Моя регистрация и обработка выглядит следующим образом:

private void registerTest() 
{ 
    long tokenId = getNextToken(); 
    ExtraData data = new ExtraData(); 
    Messenger.Default.Register<MyMsg>(this, tokenId, (m) => recieve(m,data)); 
} 

private void receive(MyMsg m,ExtraData data) 
{ 
    Messenger.Default.Unregister<MyMsg>(this, m.tokenId); 
} 

Мои отправки выглядит следующим образом:

private void sendTest(long tokenId) 
{ 
    Messenger.Default.Send(new MyMsg(tokenId), tokenId); 
} 

Я всегда зарегистрироваться лексемы X перед полученным в моем sendTest, , но по какой-то причине , иногда, когда вызывается sendTest (X), его не принимается.

У любого есть идеи, что происходит?

+0

Как выглядит остальная часть вашего класса? Как вы вводите мессенджера? –

+0

проблемы оказываются в лямбда в действии, когда не используется локальная переменная в лямбде, это будет работать. Я нашел здесь соответствующий пример [link] (http://stackoverflow.com/questions/22613828/strange-behavior-with-actions-local-variables-and-garbage-collection-in-mvvm-li) –

+0

О! Кажется, я понимаю, о чем вы говорите ... –

ответ

0

Вы должны иметь свой ExtraData как свойство класса в своем сообщении, чтобы иметь возможность взаимодействовать с ним из разных источников.

public class MyMsg { 
    public int TokenId {get;set;} 
    public ExtraData Data {get;set;} 
} 


public void registerTest() 
{ 
    Messenger.Default.Register<MyMsg>(this, recieve); 
} 

public void recieve(MyMsg myMsg) 
{ 
    Messenger.Default.Unregister<MyMsg>(this, myMsg.TokenId); 
    //Note that you can also access m.Data here if you need to 
} 


public void sendTest() 
{ 
    var myMsg = new MyMsg {TokenId = GetNextToken(), Data = new ExtraData()}; 
    Messenger.Default.Send(myMsg); 
} 
+0

Я просто сделал большое редактирование, потому что там была какая-то гадость от написания кода в редакторе на стеке. –