我們的一些MVVMcross視圖依賴於遠程服務來完全顯示自己。我們通常使用ViewModel的Init()中的任務來啓動它,使其異步。 ViewModel屬性在完成時在Task中設置,UI通過PropertyChanged通知更新。推遲PropertyChanged事件,直到視圖綁定設置完成
有時,遠程數據(和任務)在視圖綁定了偵聽器之前完成,因此沒有收到屬性更改事件。
這個問題在async Init and Property Changed in MvvmCross上觸及,但該解決方案感覺像是呈現邏輯的重複。
我們已經成功緩衝了PropertyChanged通知,直到ViewDidLoad結束,但我們想通過掛接到MVX框架來轉化爲更通用的解決方案。
有沒有辦法掛鉤mvvmcross的視圖創建在viewDidLoad完成後關閉我們的代碼?
基礎視角模式
public abstract class BaseViewModel : MvxViewModel{
protected bool _deferPropertyChangedEvents = true;
private readonly List<PropertyChangedEventArgs> _deferedPropertyChangedEvents = new List<PropertyChangedEventArgs>();
public override void RaisePropertyChanged(PropertyChangedEventArgs changedArgs)
{
lock(_deferedPropertyChangedEvents){
if (!_deferPropertyChangedEvents)
{
base.RaisePropertyChanged(changedArgs);
}
else
{
// buffer it up
_deferedPropertyChangedEvents.Add(changedArgs);
}
}
}
public void EndDeferringPropertyChangedEvents()
{
lock(_deferedPropertyChangedEvents){
_deferPropertyChangedEvents = false;
// playback all buffered notifications
foreach (var e in _deferedPropertyChangedEvents)
{
RaisePropertyChanged(e);
}
_deferedPropertyChangedEvents.Clear();
}
}
}
樣品視圖
public class SomeView : MvxViewController
{
public override void ViewDidLoad()
{
base.ViewDidLoad();
var bindings = this.CreateBindingSet<StopView, SomeViewModel>();
.....
bindings.Apply();
// plays back any PropertyChanged() notifications that were buffered
// up while the view was initializing
// ---> want to find a way to have MVX call this
ViewModel.EndDeferringPropertyChangedEvents();
}
}
您的評論讓我懷疑問題是由我們的代碼中的某些東西引起的 - 我會多挖一點。感謝您澄清綁定過程 – geoffreys
祝您好運。我仍然非常接受這個想法,這可能是一個普遍的問題。多線程有找到邏輯上的差距的方法。 – Stuart
我沒有找到確切的原因,只發生在20次執行中的每一次,並且只在一個屏幕上發生。我們現在將使用我們的解決方法,並稍後嘗試查找原因。 – geoffreys