Привязка кнопки Xamarin MVVM к команде не работает - PullRequest
0 голосов
/ 10 ноября 2019

Только начал использовать Xamarin - уже 10 лет использую PRISM с WPF. Не удается получить привязку для работающих команд кнопок. Привязка метки к собственности работает нормально (бла-фрик). Я устанавливаю BindingContext в коде (в ctor виртуальной машины) (потому что я разделяю Views и ViewModels в разных проектах).

Когда я нажимаю кнопку в приложении, обработчик команд никогда не срабатывает. Если я установлю команду на кнопку в коде (раскомментируйте последнюю строку ctor VM).

Кто-нибудь знает, почему это не работает? я что-то пропустил? Нужно ли использовать ViewModelLocator и связать его в XAML? спасибо.

XAML (MainPage.xaml):

        <Label Text="{Binding Blah}" />

        <Button
        x:Name="rotateButton"
        Command="{Binding RotateCommand}"
        HorizontalOptions="Center"
        Text="Click to Rotate Text!"
        VerticalOptions="CenterAndExpand" />

XAML (MainPage.xaml.cs):

    public partial class MainPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    public Button RotateButton => rotateButton;

    public async void RotateLabel()
    {
        await label.RelRotateTo(360, 1000);
    }
}

VM (MainPageViewModel.cs):

    private string _blah;
    public MainPageViewModel(MainPage mainPage)
    {
        mainPage.BindingContext = this;
        RotateCommand = new Command(HandleRotateCommand,
            () => true);
        //if i uncomment this, the button fires.  not ideal obviously.
        //mainPage.RotateButton.Command = RotateCommand;
    }
    public ICommand RotateCommand { get; }

    public string Blah
    {
        get => _blah;
        set
        {
            _blah = value;
            OnPropertyChanged();
        }
    }

    private void HandleRotateCommand()
    {
        Debug.WriteLine("HandleRotateCommand");
        View.RotateLabel();
    }

1 Ответ

1 голос
/ 11 ноября 2019

Краткий ответ

Все, что вам нужно сделать (используя код, которым вы поделились), это переместить настройку BindingContext в конец вашей ViewModel конструктор, например

public MainPageViewModel(MainPage mainPage)
{

    RotateCommand = new Command(HandleRotateCommand,
        () => true);
    //if i uncomment this, the button fires.  not ideal obviously.
    //mainPage.RotateButton.Command = RotateCommand;

    mainPage.BindingContext = this;
}

Объяснение

Проблема с вашим фрагментом кода заключается в том, что в начале конструктора ViewModel вы устанавливаете привязку,и только после этого вы создаете команду. В этой точке привязка к команде нарушена. Вот почему вы должны перенести настройку BindingContext в конец, чтобы привязка была установлена ​​для созданной Command ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...