Xamarin Forms MvvmCross 绑定一个按钮命令出错
Xamarin Forms MvvmCross binding a button command error
我正在处理 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
}
}
}
任何事情似乎都可以正常工作,但很少有时在按下按钮后它会变得禁用。会发生什么?如果我使用 Command 代替 MvxAsyncCommand,则不会发生这种情况,如下所示:
public Command TestAsyncCommand => new Command(async () => await TestAsyncCommandMethod());
注意:TestAsyncCommandMethod 完全封装在 try-catch 块中以避免可能的异常。
我认为你在这里做错的是,而不是创建一个 属性 来绑定你正在使用的视图和视图模型,你可以试试这个:
public IMvxAsyncCommand TestAsyncCommand {get; set;}
然后在您的构造函数中执行此操作:
public TestViewModel(IMvxLogProvider logProvider, IMvxNavigationService navigationService)
: base(logProvider, navigation)
{
TestAsyncCommand = new MvxAsyncCommand(async () => await TestAsyncCommandMethod());
}
更新
这似乎是 MvvmCross 的一个错误!
可以在添加的 link
中找到问题
我正在处理 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 } } }
任何事情似乎都可以正常工作,但很少有时在按下按钮后它会变得禁用。会发生什么?如果我使用 Command 代替 MvxAsyncCommand,则不会发生这种情况,如下所示:
public Command TestAsyncCommand => new Command(async () => await TestAsyncCommandMethod());
注意:TestAsyncCommandMethod 完全封装在 try-catch 块中以避免可能的异常。
我认为你在这里做错的是,而不是创建一个 属性 来绑定你正在使用的视图和视图模型,你可以试试这个:
public IMvxAsyncCommand TestAsyncCommand {get; set;}
然后在您的构造函数中执行此操作:
public TestViewModel(IMvxLogProvider logProvider, IMvxNavigationService navigationService)
: base(logProvider, navigation)
{
TestAsyncCommand = new MvxAsyncCommand(async () => await TestAsyncCommandMethod());
}
更新
这似乎是 MvvmCross 的一个错误! 可以在添加的 link
中找到问题