MVVMcross 뷰의 수는 원격 서비스에 따라 달라 지므로 완전히 표시됩니다. 우리는 일반적으로 ViewModel의 Init()에서 Task를 비동기로 가져 오기 위해 Task를 해제합니다. ViewModel 속성은 완료시 Task에 설정되고 UI는 PropertyChanged 알림을 통해 업데이트됩니다.뷰 바인딩 설정이 완료 될 때까지 PropertyChanged 이벤트를 연기하십시오.
때때로 원격 데이터 (및 작업)가보기가 해당 수신기를 바인딩하기 전에 완료되어 속성 변경 이벤트가 수신되지 않는 경우가 있습니다.
이 문제는 async Init and Property Changed in MvvmCross에서 다루어졌지만 해결책은 프리젠 테이션 논리의 중복과 같은 느낌입니다.
ViewDidLoad가 끝날 때까지 PropertyChanged 알림을 버퍼링하는 데 성공했지만, 아래에서 MVX 프레임 워크에 연결하여보다 일반적인 솔루션으로 바꾸고 싶습니다.
viewDidLoad가 완료된 후 mvvmcross의 뷰 생성을 후크하여 코드를 실행 중지 할 수 있습니까?
자료보기 모델
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();
}
}
귀하의 의견은 문제가 Google 코드의 일부로 인해 발생했음을 의심스럽게합니다. 조금만 더 살펴 보겠습니다. 바인딩 프로세스에 대한 설명 주셔서 감사합니다 – geoffreys
행운을 빕니다. 나는 이것이 일반적인 문제가 될 수 있다는 생각에 여전히 열려 있습니다. 멀티 스레딩은 로직에서 갭을 찾는 방법을 가지고 있습니다. – Stuart
나는 정확한 원인을 찾아 낼 수 없었고, 20 건의 사형마다 하나씩, 그리고 오직 한 화면에서만 말하고있다. 이제 해결 방법을 사용하고 나중에 원인을 찾으려고합니다. – geoffreys