【发布时间】:2016-11-08 16:30:01
【问题描述】:
我有一个ViewModel,它使用Commanding。在这个ViewModel 中,我想访问MediaPlugin
。有了这个插件,我必须打电话给Initialize()。因为它使用async 调用,所以我有一些时间问题。
这是我的代码:
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;
}
使用此代码,应用程序崩溃
您必须在调用任何属性之前调用 Initialize()。
在 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 移动设备(Windows 10 通用)上的 Xamarin.Forms 环境中测试此代码。
【问题讨论】:
-
能分享一下MyViewModel的用法吗?
-
它在我的 XAML 中用作
BindingContext。 -
是的,你是在初始化之前调用 BindingContex 吗?在 xmal 构造函数中是这样的吗? public LoginPage() { vm = new LoginPageViewModel();绑定上下文 = vm;初始化组件(); }
-
是的,我应该换那个吗?
-
尝试类似的方法: public LoginPage() { vm = new LoginPageViewModel();绑定上下文 = vm;初始化组件(); vm.InitData();将其公开,并删除 InitData 表单构造函数 ogf 您的视图模型。
标签: c# xamarin async-await xamarin.forms uwp