Xamarin MVVM按钮绑定到命令不起作用

时间:2019-11-10 20:11:08

标签: c# xaml xamarin.forms prism

刚刚开始使用Xamarin-在WPF中使用PRISM已有10年了。无法为按钮命令起作用而绑定。将Label绑定到属性工作正常(Blah prop)。我在代码中(在VM ctor中)设置了BindingContext(因为我在不同项目中拆分了Views和ViewModels)。

当我单击应用程序中的按钮时,命令处理程序将永远不会触发。如果我在代码中的按钮上设置了命令(取消注释VM ctor的最后一行)。

有人知道为什么这行不通吗?我错过了什么吗?我是否需要使用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 个答案:

答案 0 :(得分:1)

简短答案

您要做的所有事情(使用共享的代码)是将 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 ...

上设置绑定的原因