我正在开发一个Xamarin Forms MvvmCross项目。我在视图模型上使用IMvxAsyncCommand绑定视图上的常用按钮命令,如下所示:
<views:MvxContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:views="clr- namespace:MvvmCross.Forms.Views;assembly=MvvmCross.Forms"
x:Class="TestProject.Pages.TestPage">
<ContentView>
<StackLayout>
<Button Text="Test the command!" Command="{Binding TestAsyncCommand}"/>
</StackLayout>
</ContentView>
namespace TestProject.ViewModels
{
public class TestViewModel : MvxNavigationViewModel
{
public TestViewModel(IMvxLogProvider logProvider, IMvxNavigationService navigationService)
: base(logProvider, navigation)
{
}
public IMvxAsyncCommand TestAsyncCommand => new MvxAsyncCommand(async () => await TestAsyncCommandMethod());
private async Task TestAsyncCommandMethod()
{
//await some stuff
}
}
}
Anythings似乎工作正常,但很少有时按下按钮后它就会失效。怎么会发生什么?如果我使用Command代替MvxAsyncCommand,似乎没有发生(但我不确定),就像这里:
public Command TestAsyncCommand => new Command(async () => await TestAsyncCommandMethod());
注意:TestAsyncCommandMethod完全包含在try-catch块中以避免可能的异常。
我认为你在这里做的错误是,你可以试试这个:而不是创建一个Property来绑定View和ViewModel你正在使用一个字段:
public IMvxAsyncCommand TestAsyncCommand {get; set;}
然后在你的构造函数中执行以下操作:
public TestViewModel(IMvxLogProvider logProvider, IMvxNavigationService navigationService)
: base(logProvider, navigation)
{
TestAsyncCommand = new MvxAsyncCommand(async () => await TestAsyncCommandMethod());
}
这似乎是MvvmCross的一个错误!问题可以在添加的链接中找到