【问题标题】:Xamarin Forms MvvmCross binding a button command errorXamarin Forms MvvmCross 绑定按钮命令错误
【发布时间】: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


【解决方案1】:

我认为你在这里做错了,而不是创建一个属性来绑定视图和你正在使用一个字段的 ViewModel 你可以试试这个:

public IMvxAsyncCommand TestAsyncCommand {get; set;}

然后在你的构造函数中这样做:

public TestViewModel(IMvxLogProvider logProvider, IMvxNavigationService navigationService)
        : base(logProvider, navigation)
    {
      TestAsyncCommand = new MvxAsyncCommand(async () => await TestAsyncCommandMethod());
    }

更新

这似乎是 MvvmCross 的一个错误! 问题可以在添加的链接中找到

https://github.com/MvvmCross/MvvmCross/issues/1589

【讨论】:

  • 我试过了,但您的解决方案没有解决问题。我认为这是 Android 上的一种 MvxAsyncCommand 错误。您用 Command 替换 MvxAsyncCommand 的解决方案和我的一样完美
  • 我发现了这个 MvvmCroos 问题报告:github.com/MvvmCross/MvvmCross/issues/1589
  • 据我了解,此问题仍然存在?
  • 现在问题也解决了,如果我仍然喜欢使用命令
猜你喜欢
  • 2017-08-18
  • 2015-06-21
  • 2019-05-11
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
相关资源
最近更新 更多