【发布时间】:2019-07-30 15:05:51
【问题描述】:
我正在开发一个 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 块中以避免可能的异常。
【问题讨论】:
-
TestAsyncCommandMethod()长什么样子? -
var ret = await Xamarin.Forms.Application.Current.MainPage.DisplayAlert(...);如果(!ret)返回; ret = 等待 BackgroundBleCommunication(); if (!ret) 等待 Xamarin.Forms.Application.Current.MainPage.DisplayAlert(...);
-
Command来自原生Xamarin.Forms,而IMvxAsyncCommand来自MvvmCross。顺便建议使用public IMvxAsyncCommand TestAsyncCommand { get; private set; }。
标签: xamarin button command mvvmcross