2017-02-15 4 views
0

이미 활동에 바인딩 된 ViewModel 속성을 업데이트 할 때마다이 오류가 발생합니다. 나는 ...이 오류는 다른 스레드 (UI하지 스레드)에서 업데이트 UI와 관련이 있지만이 바인딩을 MVVMLight 방법을 제어 할 수 없다는 것을 알아MVVMLight가있는 Xamarin Android : 뷰 계층 구조를 만든 원래 스레드 만 해당 뷰를 만질 수 있습니다.

활동 :

private readonly List<Binding> _bindings = new List<Binding>(); 

public PersonViewModel ViewModel 
{ 
    get 
    { 
     return App.Locator.Detail; 
    } 
} 

private TextView _txtName; 
public TextView TxtName 
{ 
    get 
    { 
     return _txtName ?? 
      (_txtName = FindViewById<TextView>(Resource.Id.txtName)); 
    } 
} 

protected async override void OnCreate(Bundle savedInstanceState) 
{ 
    base.OnCreate(savedInstanceState); 
    SetContentView(Resource.Layout.Detail); 

    _bindings.Add(this.SetBinding(
     () => ViewModel.Person.Name, 
     () => TxtName.Text)); 

    await Task.Factory.StartNew(() => { ViewModel.LoadDetailCommand.Execute(null); }); 
} 

뷰 모델 :

private IDataService _dataService; 

private PersonObj _person; 
public PersonObj Person 
{ 
    get 
    { 
     return _person; 
    } 
    set 
    { 
     Set(ref _person, value); 
    } 
} 

private RelayCommand _loadDetailCommand; 
public RelayCommand LoadDetailCommand 
{ 
    get 
    { 
     return _loadDetailCommand 
       ?? (_loadDetailCommand = new RelayCommand(
        async() => 
        { 
         await LoadDataAsync(); 
        })); 
    } 
} 

public PersonViewModel(IDataService dataService) 
{ 
    _dataService = dataService; 
} 

private async Task LoadDataAsync() 
{ 
    try 
    { 
     Person= await _dataService.GetPerson(0); 
    } 
    catch (Exception ex) 
    { 
     // Exception here!! 
    } 
} 

답변

0

좋아, 나는 ViewModel에서 필요한 작업을 생성하고 그것을 기다리기 때문에 모든 가능한 예외를 잡을 수있다 :

Person = await Task.Run(async() => 
{ 
    var p = await _dataService.GetPerson(0); 
    return p; 
}); 

감사합니다. @xleon for the help.

1

나는 MVVMLight에 대해 아무것도 몰라,하지만 더 낫다고 생각이 라인을 변경하려고 :에

await Task.Factory.StartNew(() => { ViewModel.LoadDetailCommand.Execute(null); }); 

이에 대한을 E :

ViewModel.LoadDetailCommand.Execute(null); 
당신은 shouldn't 명령

을 실행하는 새로운 작업을 시작해야

그리고이 일이 하나

protected async override void OnCreate(Bundle savedInstanceState) 

:

protected override void OnCreate(Bundle savedInstanceState) 
+0

내가 알아야 할 것은 아니지만 LoadDetailCommand (_dataService.GetPerson)는 httpclient와 네트워크 호출을 실행하고 "NetworkOnMainThreadException"예외를 제공합니다 ... 내가 Task.Run에 캡슐화하면 어떻게 오류를 잡을 수 있습니까? –

+0

'try/catch'를 사용하더라도'async void' 메쏘드 안에있는 어떤 태스크도 예외를 생성하지 않습니다 : https://msdn.microsoft.com/en-us/magazine/jj991977.aspx?f=255&MSPPError=-2147217396 – xleon

+0

이 메서드는 void가 아닙니다 : "private async Task LoadDataAsync()" –

관련 문제