我有一個ViewModel
,它使用Commanding
。在此ViewModel
我想訪問MediaPlugin 。有了這個插件,我不得不打電話給Initialize()
。因爲它使用async
調用,我有一些計時問題。從ViewModel調用異步方法
這是我的代碼:
public ICommand CameraCommand
{
get { return _cameraCommand ?? (_cameraCommand = new Command(async() => await ExecuteCameraCommand(),() => CanExecuteCameraCommand())); }
}
public bool CanExecuteCameraCommand()
{
// Check if initialized before calling properties
if (!this.initialized)
InitMedia();
if (!this.initialized || !CrossMedia.Current.IsCameraAvailable || !CrossMedia.Current.IsTakePhotoSupported)
{
return false;
}
return true;
}
public async Task ExecuteCameraCommand()
{
// Assure that it is initialized before calling method
var file = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions {});
// ...
}
private void InitMedia()
{
CrossMedia.Current.Initialize();
this.initialized = true;
}
這段代碼的應用程序崩潰與
調用任何屬性之前,必須調用初始化()。
在Plugin.Media.MediaImplementation.get_IsCameraAvailable()
當我開始在構造函數初始化喜歡使用此代碼
public MyViewModel()
{
InitData();
}
private async Task InitData()
{
// ...
await InitMedia();
}
private async Task InitMedia()
{
await CrossMedia.Current.Initialize();
this.initialized = true;
}
public bool CanExecuteCameraCommand()
{
// Check if initialized before calling properties
if (!this.initialized)
return false;
// ...
}
CanExecuteCameraCommand()
初始化完成之前被調用。因此返回false
並禁用UI中的按鈕。
我在Windows 10 Mobile設備(Windows 10 Universal)上的Xamarin.Forms環境中測試此代碼。
你能分享MyViewModel的用法嗎? –
它用作我的XAML的['BindingContext'](https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_binding_basics/)。 – testing
是的,你是否在Initialize之前調用了BindingContex?在xmal構造函數是類似的東西? public LoginPage() { vm = new LoginPageViewModel(); BindingContext = vm; InitializeComponent(); } –