2014-01-10 32 views
2

我在MvvmCross很新,所以我可能只是做錯了什麼;或不。MvxPropertyChangedListener奇怪的行爲遇到和解決方法

爲了以防萬一,這也是一種解決方法,並指出要注意其他開發人員。

使用:的Windows Phone 8

問題:從視圖頁面,使用MvxPropertyChangedListener訂閱工作了一段時間,然後停止。

場景: ViewModel有一個屬性IsBusy,出於特定的原因,我需要從查看頁面代碼(.xaml.cs)後面訪問。的方式我想它會工作...

public LoadingView() 
{ 
    InitializeComponent(); 

    // until loaded, we can not access viewmodel 
    Loaded += (sender, args) => 
    { 
     var viewModel = (LoadingViewModel) ViewModel; 

     // add listener 
     new MvxPropertyChangedListener(viewModel).Listen(() => viewModel.IsBusy,() => 
     { 
      // do something 
     }); 
    }; 
} 

現在,用戶點擊一個命令按鈕,關於這一點我打電話使用jsonRestClient異步任務休息方法;一旦任務完成,isBusy被設置爲false;

注意:我也有isBusy綁定到xaml文件中的元素(到progressBar可見性)。

在WP Emulator中,單擊此按鈕確實會引發偵聽器事件,但只會觸發兩到三次。之後,監聽器中的代碼不再執行。有趣的是,xaml綁定仍然更新;

我不明白GC如何發揮作用;因爲該屬性在ViewModel本身中;

變通方法:沒有多少時間來調查此問題;相反,我現在使用IMvxMessenger,並從我的View代碼後面訂閱;迄今如此好,沒有錯誤。

林蛙

回答

2

MvvmCross使用weak引用了很多的用戶 - 例如適用於像ViewModel屬性訂閱和類似訂閱Messenger的訂閱。

源爲MvxPropertyChangedListener是在https://github.com/MvvmCross/MvvmCross/blob/v3.1/Cirrious/Cirrious.MvvmCross/ViewModels/MvxPropertyChangedListener.cs

此類訂閱,查看模型的變化使用:

_token = _notificationObject.WeakSubscribe(NotificationObjectOnPropertyChanged); 

_token存儲在私有成員變量。

由於您的代碼將屬性偵聽器創建爲臨時對象,因此此對象將存在一段時間,但會在由系統確定的某個點處被垃圾收集。當它是GC'd時,_token也會如此 - 因此訂閱本身將停止工作。

要解決這個問題,在一個領域存儲在您的視圖屬性監聽器:

_isBusyListener = new MvxPropertyChangedListener //.... 

這將受益於被GC'd

停止