Xamarin无法在代码/视图模型中绑定ICommand

时间:2018-04-05 15:44:06

标签: android xamarin.forms

我正在使用VS 2017的MVVM方法开发一个简单的Xamarin.Forms应用程序。一切都在UWP中按预期工作,但我的Android项目不执行获取/设置ICommand属性的代码行。我可以在设置属性值的行上设置断点,以及之前的行和后面的行。我在前后两行都打破了,但没有设置属性的行。

这是我的模型代码:

public LoginPageViewModel(INavigation navigation) : base() 
{
        Navigation = navigation;
        LoginButtonClicked = new Command(Login, () => true);
        PasswordHintButtonClicked = new Command(PasswordHint, () => true);
}

我的XAML.cs:

btnLogin.SetBinding(Button.CommandProperty,  nameof(vm.LoginButtonClicked), BindingMode.OneWay);
btnPasswordHint.SetBinding(Button.CommandProperty, nameof(vm.PasswordHintButtonClicked), BindingMode.OneWay);

正如我所说,我可以打破设置Navigation属性而不是命令属性。如果我将Navigation = navigation移动到构造函数的最后一行,我仍然会打破它。

我也试过了:

private ICommand _loginButtonClicked;
public ICommand LoginButtonClicked
{
    get { return _loginButtonClicked ?? (_loginButtonClicked = new 
    Command(Login, () => true)); }
}

这应该非常简单。也许我在配置Android模拟器时犯了一个错误?如果有人在看到正确的方向推动之前有人看到过这样的事情,那我几天就一直在反对这一点。

2 个答案:

答案 0 :(得分:0)

您似乎需要在BindingContext方法之前设置SetBinding。 例如,如果代码如下所示:

        public MainPage()
        {
            InitializeComponent();
            LoginPageViewModel vm = new LoginPageViewModel();
            BindingContext = vm;
            btnLogin.SetBinding(Button.CommandProperty, nameof(vm.LoginButtonClicked), BindingMode.OneWay);
            btnPasswordHint.SetBinding(Button.CommandProperty, nameof(vm.PasswordHintButtonClicked), BindingMode.OneWay);                
        }

然后它可以在设置属性并调用方法的行上中断。

您可以参考此link了解详情。

答案 1 :(得分:0)

如果有人遇到此问题,在我的情况下,它是由缺少Preserve属性引起的。我已将属性添加到所有外部程序集,但我的视图模型也需要它。由于某种原因,链接器并没有引入整个类,即使它在.xaml.cs页面中被引用。