数据绑定到Switch

问题描述 投票:0回答:2

我正在尝试根据 Switch 上打开的内容来更改 bool 。方法在 xaml.cs 中有效,但我想在 ViewModel 中执行此操作。有可能吗?如果是的话我该怎么办?

git:https://github.com/wojblaz/Clicer-Game---final/commits/master/Clicer%20Game

在 ViewModel 中我收到错误: “ClassicMode.ModeSelector”由于其保护级别而无法访问。

(模式选择器是开关名称) 如果没有 ClassicMode,也会发生同样的情况(它是视图的名称)。

视图(Xaml)-经典模式:

x:Type 定义好了吗? `

        <Switch
            x:Name="ModeSelector"
            IsToggled="False"
            Toggled="{Binding Source={RelativeSource AncestorType={x:Type viewmodels:ClassicModelViewModel}}, Path=BindingContext.ModeSelector_ToggledCommand}"
            Grid.Row="1"
            Grid.Column="0"
            HorizontalOptions="Center"/>

`

Xaml.cs - BindingContext `

using Clicer_Game.ViewModels;
using CommunityToolkit.Mvvm.Input;


namespace Clicer_Game.Views;

public partial class ClassicMode : ContentPage
{
    public ClassicMode()
    {
        InitializeComponent();
        BindingContext = new ClassicModelViewModel();
    }

}

`

视图模型

`


    private bool IsTime;

        [RelayCommand]
        private void ModeSelector_Toggled()
        {
            if (ClassicMode.ModeSelector.IsToggled)
            {
                IsTime = false;
            }
            else
            {
                IsTime = true;
            }
        }

`

ModeSelector_Toggled 方法中应该使用什么参数?

data-binding parameters binding switch-statement .net-maui
2个回答
0
投票

您可以查看此链接。它详细讲述了

Inaccessible due to its protection level
。选择
ModeSelector
并按 F12,您应该看到以下内容:

private global::Microsoft.Maui.Controls.Switch ModeSelector;

访问级别为

private

方法一:可以在代码中创建一个Switch,查看这个官方代码。记得将 Switch 的访问级别设置为

public

方法2:直接在

MainPage.xaml.cs
文件中写入相关代码:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private void Switch_Toggled(object sender, ToggledEventArgs e)
    {
      if (ModeSelector.IsToggled)
            {
                IsTime = false;
            }
            else
            {
                IsTime = true;
            }
    }
}

视图模型:

pubulic static bool IsTime;

0
投票

您可以在 Switch 中使用“命令”。但你不能直接在控制事件中使用命令。您可以做的是使用“CommunityToolkit.Maui”NuGet 包提供的“EventToCommandBehavior”行为。

请参阅官方 .NET MAUI 文档:EventToCommandBehaviour 行为的 MAUI 官方文档

对于您的代码,您可以尝试以下操作:-

查看:

<Switch x:Name="ModeSelector"
        IsToggled="False"
        Grid.Row="1"
        Grid.Column="0"
        HorizontalOptions="Center">
            <Switch.Behaviors>
                <toolkit:EventToCommandBehavior
                    EventName="Toggled"
                    Command="{Binding ModeSelector_ToggledCommand}" />
            </Switch.Behaviors>
</Switch>

视图模型:

  private bool IsTime;

    [RelayCommand]
    private void ModeSelector_Toggled()
    {
        if (ClassicMode.ModeSelector.IsToggled)
        {
            IsTime = false;
        }
        else
        {
            IsTime = true;
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.