我正在尝试根据 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 方法中应该使用什么参数?
您可以查看此链接。它详细讲述了
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;
您可以在 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;
}
}