我在一个Xaml页面中有多个开关,当使用开关和处理状态更改等时,我很难掌握MVVM的概念。我尝试在视图模型中捕获xaml.cs文件中的ViewModel中的对象和参数。
交换机上的Microsoft标准交换机Xaml。
<Switch Toggled="OnToggled" />
字符串
同一页Xaml.cs文件
void OnToggled(object sender, ToggledEventArgs e)
{
// I have the sender so can target the switch now and change values colours etc.
}
型
现在是这个巨大的咳嗽让我跳进了Mvvm,我没能抓住。
我已经遵循了Mvvm上的每一个指南/演示/教程,但我不知道如何使用Maui Community Toolkit和使用View Model来做几乎相同的事情,我可以删除代码中的Xaml.cs元素。因为我认为页面不应该知道视图,反之亦然。
我现在的代码如下:- SettingsPage.xaml
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyProject.Views.SettingsPage"
xmlns:mct="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
xmlns:vm="clr-namespace:MyProject.ViewModels"
x:DataType="vm:SettingsPageViewModel"
BackgroundColor="{DynamicResource PageBackGround}">
<ContentPage.Content>
<StackLayout>
<Switch IsToggled = "True"
<Switch.Behaviors>
<mct:EventToCommandBehavior
x:TypeArguments="x:Object"
EventName="Toggled"
Command="{Binding ToggledCommand}" />
</Switch.Behaviors>
</Switch>
</StackLayout>
</ContentPage.Content>
</ContentPage>
型
SettingsPage.xaml.cs
namespace MyProject.Views;
public partial class SettingsPage : ContentPage
{
ILogger<SettingsPage> _logger;
public SettingsPage(SettingsPageViewModel settingsPageViewModel, ILogger<SettingsPage> logger)
{
InitializeComponent();
BindingContext = settingsPageViewModel;
_logger = logger;
_logger.LogInformation("Navigation to Settings Page.");
}
}
型
SettingsPageViewModel.cs
namespace MyProject.ViewModels
{
public partial class SettingsPageViewModel : BaseViewModel
{
ILogger<SettingsPageViewModel> _logger;
LogController LogController;
public SettingsPageViewModel(ILogger<SettingsPageViewModel> logger)
{
_logger = logger;
LogController = new LogController();
}
// Here I want to capture the object so that I can have multiple switches on the page and be able to identify them to change values etc for what states they are in.
[RelayCommand]
public void Toggled(ToggledEventArgs e)
{
var bangingMyheadAgainstAWall = "e";
}
}
}
型
我也尝试过不使用EventToCommandBehaviour,而只是使用标准的Toggled,Istoggled,OnToggled,IWishIknewWhichSwitchWasToggled,但我就是无法将属性传递到视图模型,或者我已经把自己逼到了一个角落,有点困惑。
任何帮助/推动在正确的方向,以帮助我正确处理这种情况将不胜感激。提前感谢。
1条答案
按热度按时间4ktjp1zp1#
你好像把事情搞复杂了。你可以忘记大部分关于事件和获取/设置值的方式。这里的关键字是data binding。
IsToggled
与.NET MAUI中的大多数属性一样,是一个bindable property。这意味着您可以将视图模型中的属性绑定到它,并且控件将在发生更改时更新该属性,而不需要事件。你主要是在那里与你的代码虽然!你可以删除事件命令的东西,你不需要它。也除去
将
Switch
更改为:<Switch IsToggled = "{Binding MyProperty}"/>
个在你的
SettingsPageViewModel
上添加一个这样的属性,这是假设使用MVVM工具包:字符串
现在,无论何时切换开关,代码中的属性都应反映新值,反之亦然。
据我所知你的想法是:我需要一个事件来捕获切换的交换机,但这不是MVVM,所以我需要一个
Command
来做同样的事情。通常不是这样的。
Command
实际上只用于执行逻辑,而不是设置或检索控制值。如果我能提供最后一个不请自来的建议:如果您刚开始使用MVVM,请尝试不使用Toolkit。我喜欢MVVM工具包,它很神奇,但它也有很多魔力。如果您了解MVVM的使用方法,它将提高您的工作效率,并且非常有帮助。如果你刚刚开始,这只会增加混乱。