2017-02-15 74 views
0

每當我更新已在活動中綁定的ViewModel屬性時,我收到此錯誤。我知道這個錯誤是從另一個線程(不是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的幫助。

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()」 –

相關問題