Xamarin MVVM 按钮绑定到命令不起作用
Xamarin MVVM Button Binding To Command Not Working
刚开始使用 Xamarin - 将 PRISM 与 WPF 一起使用已有 10 年。无法绑定按钮命令。将标签绑定到 属性 工作正常(Blah prop)。我在代码中设置了 BindingContext(在 VM ctor 中)(因为我在不同的项目中拆分了 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();
}
简答
您所要做的(使用您分享的代码)就是将 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...
刚开始使用 Xamarin - 将 PRISM 与 WPF 一起使用已有 10 年。无法绑定按钮命令。将标签绑定到 属性 工作正常(Blah prop)。我在代码中设置了 BindingContext(在 VM ctor 中)(因为我在不同的项目中拆分了 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();
}
简答
您所要做的(使用您分享的代码)就是将 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...