0

我正在尝试在我的 Xamarin Forms 应用程序中实现“命令”,以遵循 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>

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

但是,视图模型中的命令没有被调用。我在命令代码的开头设置了一个断点,并且断点永远不会到达。

有什么我想念的吗?我不能让它工作。

绑定上下文设置在 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);
        }
4

1 回答 1

0

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

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

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

于 2021-02-04T23:00:44.683 回答