以下是MainPage.xaml的XAML代码:

    <?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="mauiApp.MainPage"
                 xmlns:viewmodel="clr-namespace:mauiApp.ViewModel"
                 x:DataType="viewmodel:MainViewModel">
    
        <Grid RowDefinitions="100, Auto, *"
              ColumnDefinitions=".75*,.25*"
              Padding="10"
              RowSpacing="10"
              ColumnSpacing="10">
            
            <Image Grid.ColumnSpan="2"
                   Source="dotnet_bot.png"
                   BackgroundColor="Transparent"/>
    
            <Entry Placeholder="Enter task"
                   Text="{Binding Text}"
                   Grid.Row="1"/>
    
            <Button Text="Add"
                    Command="{Binding AddCommand}"
                    Grid.Row="1"
                    Grid.Column="1"/>
            
            <CollectionView Grid.Row="2" 
                            Grid.ColumnSpan="2"
                            ItemsSource="{Binding Items}">
    
                <CollectionView.ItemTemplate>
                    <DataTemplate x:DataType="{x:Type x:String}">
                        <SwipeView>
                            <SwipeView.RightItems>
                                <SwipeItem Text="Delete"
                                           BackgroundColor="Red"
                                           Command="{Binding Source={RelativeSource AncestorType={x:Type viewmodel:MainViewModel}},Path=DeleteCommand}"
                                           CommandParameter="{Binding .}"/> 
                            </SwipeView.RightItems>
                            <Grid Padding="0,5">
                                <Frame>
                                    <Label Text="{Binding .}"
                                           FontSize="24"/>
                                </Frame>
                            </Grid>
                        </SwipeView>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
        </Grid>
    </ContentPage>

以下是MainViewModel.cs的C#代码:

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;

namespace mauiApp.ViewModel
{

    public partial class MainViewModel : ObservableObject
    {
        public MainViewModel()
        {
            Items = new ObservableCollection<string>();
        }

        [ObservableProperty]
        ObservableCollection<string> items;

        [ObservableProperty]
        string text;

        [RelayCommand]
        void Add()
        {
            if(string.IsNullOrWhiteSpace(Text)) 
            { 
                return; 
            }
            Items.Add(Text);
            Text = string.Empty;
        }

        [RelayCommand]
        void Delete(string s)
        {
            if (Items.Contains(s))
            {
                Items.Remove(s);
            }

        }
    }
}

以下是MainProgram.cs的C#代码:

using mauiApp.ViewModel;

namespace mauiApp;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });

        builder.Services.AddSingleton<MainPage>();
        builder.Services.AddSingleton<MainViewModel>();
        return builder.Build();
    }
}

以下是MainPage.xaml.cs的C#代码:

using mauiApp.ViewModel;

namespace mauiApp

public partial class MainPage : ContentPage
{
    public MainPage(MainViewModel vm)
    {
        InitializeComponent();
        BindingContext = vm;
    }
}

我正在努力学习毛伊语,我从YouTube频道的DotNet教程中复制了以下代码.然而,CollectionView中的滑动到删除功能并未按预期工作:

  • 当我滑动并点击"Delete"时,该项不会从集合中移除,Delete方法也不会被击中.

推荐答案

我怀疑数据模板中的RelativeSource无法遍历引用该数据模板的XAML树.或者,可能是因为数据模板的BindingContext是单独的项,而不是页的BindingContext,因此找不到MainViewModel.

另一种方法是使用x:Name作为信号源:

<ContentPage ...
                 x:Class="mauiApp.MainPage"
                 x:Name="thisPage"
                 ...>
                 
    ...
    <SwipeItem ...
               Command="{Binding BindingContext.DeleteCommand, Source={x:Reference thisPage}}"
               CommandParameter="{Binding .}"/> 
    

Or if you prefer this syntax:
Command="{Binding Source={x:Reference thisPage}, Path=BindingContext.DeleteCommand}"

Csharp相关问答推荐

元素存在方法是否损坏

我如何才能获得被嘲笑班级的私有成员?

是否可以将gltf转换为字节数组,然后将字节数组转换回文件?

通过条件列表删除/更新EF Core 7中的实体的有效方法

Blazor. NET 8—阶段启动配置文件不启动网站VS2022

在.NET核心项目中创建Startup.cs比在Program.cs中注册服务好吗?

如何在C#中创建VS代码中的控制台应用程序时自动生成Main方法

委托RequestDelegate不带2个参数-ASP.NET Core 8最小API

使用System.Text.Json进行序列化时发生StackOverflow异常

Blazor Fluent UI DialogService,<;FluentDialogProvider/>;错误

如何允许数组接受多个类型?

为什么我不能从我的异步任务方法中返回异步任务方法?

MSI无法将快捷方式添加到启动文件夹

将J数组转换为列表,只保留一个嵌套的JToken

在平行内使用跨度.用于循环

Visual Studio如何使用当前的框架?

ASP.NET核心8:app.UseStaticFiles()管道执行顺序

如何在.NET MAUI上在iOS和Mac之间共享代码?(no条件编译和无代码重复)

使用postman 测试配置了身份的.NET 6应用程序

使用ITfoxtec.Identity.Saml2解析相同键多值SAML 2声明