XAML MAUI控件中的RelativeSource未绑定

rekjcdws  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(166)

我将通过简单的例子解释视频:
https://youtu.be/5Qga2pniN78?t=961
在16.minute(上面链接中的时间戳),他对SwipeItem执行Delete命令。
在我的本地项目中,到目前为止一切正常,但是删除命令从未被触发。我检查了源代码生成器,DeleteCommand存在。
我的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="MauiApp1.MainPage"
             xmlns:viewmodel="clr-namespace:MauiApp1.ViewModel"
             x:DataType="viewmodel:MainViewModel">

    <Grid RowDefinitions="100, Auto, *"
          ColumnDefinitions=".75*, .25*"
          Padding="10"
          RowSpacing="10"
          ColumnSpacing="10">

        <Image Grid.ColumnSpan="2" Source="tom.jpg"
               BackgroundColor="Transparent"></Image>

        <Entry Placeholder="Enter task" Grid.Row="1" Text="{Binding Text}"></Entry>

        <Button Text="Add" Grid.Row="1" Grid.Column="1" Command="{Binding AddCommand}"></Button>

        <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 .}">
                            </SwipeItem>
                        </SwipeView.RightItems>
                        <Grid Padding="0,5">
                            <Frame>
                                <Label Text="{Binding .}" FontSize="24"></Label>
                            </Frame>
                        </Grid>
                    </SwipeView>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </Grid>
</ContentPage>

查看型号:

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

namespace MauiApp1.ViewModel
{
    public partial class MainViewModel : ObservableObject
    {
        public MainViewModel()
        {
            Items = new();
            Items.Add("test");
        }

        [ObservableProperty]
        private ObservableCollection<string> items;

        [ObservableProperty]
        private string text;

        [RelayCommand]
        private void Add()
        {
            if (string.IsNullOrWhiteSpace(text))
            {
                return;
            }

            Items.Add(Text);

            Text = string.Empty;
        }

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

为什么DeleteCommand未触发?

w8rqjzmb

w8rqjzmb1#

试试这个

Command="{Binding BindingContext.DeleteCommand,
      Source={x:Reference myPage}}"

其中myPage是页面的名称

<ContentPage x:Name="myPage" ...
7uhlpewt

7uhlpewt2#

决议:
我忘了在<SwipeView.RightItems>之后添加<SwipeItems>元素。

ttcibm8c

ttcibm8c3#

祖先类型={x:类型视图模型:主视图模型}
您的视图模型不是可视化树的一部分,因此无论如何都不能使用相对源绑定到它。
您可以使用CollectionView的绑定上下文,然后使用所需的特定属性:

Command="{Binding BindingContext.DeleteCommand, Source={RelativeSource AncestorType={x:Type CollectionView}}}

相关问题