EventToCommandBehavior 不调用命令

EventToCommandBehavior does NOT call the Command

我正在尝试在我的 Xamarin Forms 应用程序中实现“Commanding”,以遵循 MVVM 架构模式。

对于按钮,它工作得很好,因为您可以在 XAML 中定义命令。 但是对于 Picker,例如,你必须执行以下操作 (注意:xct:EventToCommandBehavior 使用了新的 Xamarin 社区工具包):

<Picker x:Name="myBackgroundColorChoicePicker" SelectedItem="{Binding BGColorChoice, Mode=TwoWay}"
    x:FieldModifier="public"
    TextColor="{DynamicResource TextForegroundColor}"
    WidthRequest="300" HorizontalOptions="CenterAndExpand">

    <Picker.Items>
        <x:String>User Selected</x:String>
        <x:String>Totally White</x:String>
        <x:String>Totally Black</x:String>
    </Picker.Items>

    <Picker.Behaviors>
        <xct:EventToCommandBehavior
            EventName="SelectedIndexChanged"
            Command="{Binding ProcessBGColorChoiceCommand}"/>
    </Picker.Behaviors>
</Picker>

因此,我希望当用户更改 Picker 中的所选项目时,将从 ViewModel 调用命令 ProcessBGColorChoiceCommand

但是,未调用 ViewModel 中的命令。我在 Command 代码的开头设置了一个断点,但从未到达断点。

有什么我想念的吗?我无法让它工作。

绑定上下文设置在 XAML 的顶部,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:viewModels="clr-namespace:MedLemnMobile.ViewModels"
             xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
             x:Class="MedLemnMobile.Views.ColorPage"
             Title="Color"
             x:FieldModifier="public"
             x:Name="myColorPage"
             AutomationId="myColorPage"
             BackgroundColor="{DynamicResource PageBackgroundColor}"
             x:DataType="viewModels:ColorViewModel">

    <ContentPage.BindingContext>
        <viewModels:ColorViewModel/>
    </ContentPage.BindingContext>

并且,命令在 ViewModel 中定义如下:

using MedLemnMobile.Classes;
using MedLemnMobile.Models;
using MedLemnMobile.Views;
using System;
using System.Globalization;
using System.Windows.Input;
using Xamarin.Forms;
using Xamarin.CommunityToolkit;

namespace MedLemnMobile.ViewModels
{
    public class ColorViewModel : ViewModelBase
    {
        public ICommand GotoMenuCommand { get; }
        public ICommand ProcessBGColorChoiceCommand { get; }
        public ICommand ProcessFGColorChoiceCommand { get; }
        public ICommand ProcessBGRedSliderCommand { get; }
        public ICommand ProcessBGGreenSliderCommand { get; }
        public ICommand ProcessBGBlueSliderCommand { get; }
        public ICommand ProcessFGRedSliderCommand { get; }
        public ICommand ProcessFGGreenSliderCommand { get; }
        public ICommand ProcessFGBlueSliderCommand { get; }

        public ColorViewModel()
        {
            IsBGColorChoiceUserSelected = EquationLibrary.MyCurrentEqSet.BackgroundColorChoice == "User Selected";
            IsFGColorChoiceUserSelected = EquationLibrary.MyCurrentEqSet.ForegroundColorChoice == "User Selected";

            GotoMenuCommand = new Command<ColorPage>(GotoMenu);
            ProcessBGColorChoiceCommand = new Command<ColorPage>(ProcessBGColorChoice);
            ProcessFGColorChoiceCommand = new Command<ColorPage>(ProcessFGColorChoice);
            ProcessBGRedSliderCommand = new Command<ColorPage>(ProcessBGRedSlider);
            ProcessBGGreenSliderCommand = new Command<ColorPage>(ProcessBGGreenSlider);
            ProcessBGBlueSliderCommand = new Command<ColorPage>(ProcessBGBlueSlider);
            ProcessFGRedSliderCommand = new Command<ColorPage>(ProcessFGRedSlider);
            ProcessFGGreenSliderCommand = new Command<ColorPage>(ProcessFGGreenSlider);
            ProcessFGBlueSliderCommand = new Command<ColorPage>(ProcessFGBlueSlider);
        }

命令 ProcessBGColorChoiceCommand 已使用参数 ColorPage 实例化。
但是您的 xaml 中没有命令参数绑定。要解决这个问题,请更改命令定义

ProcessBGColorChoiceCommand = new Command(ProcessBGColorChoice);
//also check other commands

并在 ProcessBGColorChoice 方法中从 属性 BGColorChoice 中获取选定值。