You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI绑定:如何将RelayCommand放在ViewModel并传递Model数据

MAUI绑定ViewModel命令到DataTemplate的解决方法

在你的场景里,DataTemplate默认的绑定上下文是单个Video模型对象,直接写{Binding PlayVideoCommand}会去Video类里找命令,不符合要求。要绑定到ViewModel里的命令,需要通过获取父级控件的BindingContext来实现,以下是两种常用方法:

方法一:使用RelativeSource查找父级CollectionView

修改TapGestureRecognizer的绑定,通过RelativeSource向上找到CollectionView(它的BindingContext就是你的ViewModel),然后绑定到ViewModel里的PlayVideoCommand:

<Image.GestureRecognizers>
    <TapGestureRecognizer
        Command="{Binding BindingContext.PlayVideoCommand, Source={RelativeSource AncestorType={x:Type CollectionView}}}"
        CommandParameter="{Binding VideoID}" />
</Image.GestureRecognizers>

方法二:使用x:Reference绑定命名的CollectionView

给你的CollectionView添加一个名称,然后通过x:Reference直接引用它的BindingContext:

<CollectionView x:Name="VideoListCollection"
                Grid.Row="0"
                Grid.ColumnSpan="2"
                Margin="0,0"
                RemainingItemsThreshold="5"
                RemainingItemsThresholdReached="OnCollectionViewRemainingItemsThresholdReached"
                ItemsSource="{Binding YourVideos}">
    <!-- 其他代码不变 -->
    <Image.GestureRecognizers>
        <TapGestureRecognizer
            Command="{Binding BindingContext.PlayVideoCommand, Source={x:Reference VideoListCollection}}"
            CommandParameter="{Binding VideoID}" />
    </Image.GestureRecognizers>
    <!-- 其他代码不变 -->
</CollectionView>

ViewModel中命令的定义(以CommunityToolkit.Mvvm为例)

确保你的ViewModel里已经正确定义了带参数的RelayCommand,参数类型要和VideoID一致(比如string或int):

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;

public class YourViewModel : ObservableObject
{
    // 假设YourVideos是你的视频集合属性
    public ObservableCollection<Video> YourVideos { get; set; } = new();

    [RelayCommand]
    private void PlayVideo(string videoId)
    {
        // 这里写根据videoId播放视频的逻辑
    }
}

注意事项

  • 如果你的VideoID是数值类型(比如int),把ViewModel里命令的参数类型改成int即可
  • 确保你的ViewModel已经设置为页面的BindingContext(比如在页面构造函数里BindingContext = new YourViewModel();)

内容的提问来源于stack exchange,提问作者vdidxho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:16:04