XAML .Net Maui Switch使用MVVM Community ToolKit将Object Sender返回到视图模型

f2uvfpb9  于 2023-08-01  发布在  .NET
关注(0)|答案(1)|浏览(99)

我在一个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,但我就是无法将属性传递到视图模型,或者我已经把自己逼到了一个角落,有点困惑。
任何帮助/推动在正确的方向,以帮助我正确处理这种情况将不胜感激。提前感谢。

4ktjp1zp

4ktjp1zp1#

你好像把事情搞复杂了。你可以忘记大部分关于事件和获取/设置值的方式。这里的关键字是data binding
IsToggled与.NET MAUI中的大多数属性一样,是一个bindable property。这意味着您可以将视图模型中的属性绑定到它,并且控件将在发生更改时更新该属性,而不需要事件。
你主要是在那里与你的代码虽然!你可以删除事件命令的东西,你不需要它。也除去
Switch更改为:<Switch IsToggled = "{Binding MyProperty}"/>
在你的SettingsPageViewModel上添加一个这样的属性,这是假设使用MVVM工具包:

[ObservableProperty]
private bool myProperty;

字符串
现在,无论何时切换开关,代码中的属性都应反映新值,反之亦然。
据我所知你的想法是:我需要一个事件来捕获切换的交换机,但这不是MVVM,所以我需要一个Command来做同样的事情。
通常不是这样的。Command实际上只用于执行逻辑,而不是设置或检索控制值。
如果我能提供最后一个不请自来的建议:如果您刚开始使用MVVM,请尝试不使用Toolkit。我喜欢MVVM工具包,它很神奇,但它也有很多魔力。如果您了解MVVM的使用方法,它将提高您的工作效率,并且非常有帮助。如果你刚刚开始,这只会增加混乱。

相关问题