Xamarin Forms MvvmCross связывает ошибку команды кнопки - PullRequest
0 голосов
/ 08 марта 2019

Я работаю над проектом Xamarin Forms MvvmCross. Я связываю команду общего вида в представлении с IMvxAsyncCommand для модели представления следующим образом:

  • View

    <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, чтобы избежать возможных исключений.

1 Ответ

0 голосов
/ 08 марта 2019

Я думаю, что вы делаете неправильно, так это то, что вместо создания свойства для привязки вида и модели представления, которое вы используете поле, вы можете попробовать это:

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

...