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

使用Relay Command时从ViewModel清除CollectionView选中项

实现跳转后清除CollectionView选中项的几种方法

方法一:通过ViewModel绑定属性重置(推荐,符合MVVM规范)

核心思路是将CollectionView的SelectedItem绑定到ViewModel的可观察属性,跳转后直接将该属性设为null即可清除选中状态。

  1. ViewModel代码
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using System.Windows.Input;

// 替换成你的新闻模型
public class NewsModel
{
    public string Title { get; set; }
    public string Content { get; set; }
}

public partial class NewsViewModel : ObservableObject
{
    // 新闻列表数据源
    public ObservableCollection<NewsModel> NewsList { get; set; } = new();

    // 绑定到CollectionView的SelectedItem
    [ObservableProperty]
    private NewsModel? _selectedNews;

    [RelayCommand]
    private async Task GoToDetails()
    {
        if (SelectedNews == null) return;

        // 执行页面跳转逻辑
        await Shell.Current.GoToAsync(nameof(NewsDetailPage), new Dictionary<string, object>
        {
            { "NewsItem", SelectedNews }
        });

        // 跳转后直接清除选中项
        SelectedNews = null;
    }
}
  1. NewsPage.xaml绑定设置
<CollectionView x:Name="cvNewsCollectionView"
                ItemsSource="{Binding NewsList}"
                SelectedItem="{Binding SelectedNews}"
                SelectionMode="Single">
    <!-- 自定义ItemTemplate -->
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Label Text="{Binding Title}" />
        </DataTemplate>
    </CollectionView.ItemTemplate>
    <!-- 绑定点击命令到ViewModel的GoToDetails -->
    <CollectionView.GestureRecognizers>
        <TapGestureRecognizer Command="{Binding GoToDetailsCommand}" />
    </CollectionView.GestureRecognizers>
</CollectionView>

方法二:通过View后台代码直接操作

如果更习惯在视图层处理选中状态,可以监听CollectionView的SelectionChanged事件,跳转后直接重置选中项。

  1. NewsPage.xaml绑定事件
<CollectionView x:Name="cvNewsCollectionView"
                ItemsSource="{Binding NewsList}"
                SelectionMode="Single"
                SelectionChanged="CvNewsCollectionView_SelectionChanged">
    <!-- 自定义ItemTemplate -->
</CollectionView>
  1. NewsPage.xaml.cs事件处理
private async void CvNewsCollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (cvNewsCollectionView.SelectedItem is NewsModel selectedItem)
    {
        var viewModel = (NewsViewModel)BindingContext;
        // 调用ViewModel的跳转命令
        await viewModel.GoToDetailsCommand.ExecuteAsync(null);
        
        // 直接清除选中项
        cvNewsCollectionView.SelectedItem = null;
    }
}

方法三:用Messenger解耦(适合复杂场景)

如果需要跨页面解耦操作,可以使用CommunityToolkit的Messenger发送清除选中项的消息。

  1. 定义消息类
public class ClearNewsSelectionMessage { }
  1. NewsViewModel注册消息
using CommunityToolkit.Mvvm.Messaging;

public partial class NewsViewModel : ObservableObject
{
    [ObservableProperty]
    private NewsModel? _selectedNews;

    public NewsViewModel()
    {
        // 注册清除选中项的消息
        WeakReferenceMessenger.Default.Register<ClearNewsSelectionMessage>(this, (_, __) =>
        {
            SelectedNews = null;
        });
    }

    [RelayCommand]
    private async Task GoToDetails()
    {
        if (SelectedNews == null) return;
        await Shell.Current.GoToAsync(nameof(NewsDetailPage), new Dictionary<string, object>
        {
            { "NewsItem", SelectedNews }
        });
    }
}
  1. NewsDetailPage发送消息
protected override void OnAppearing()
{
    base.OnAppearing();
    // 页面出现时发送清除选中项的消息
    WeakReferenceMessenger.Default.Send(new ClearNewsSelectionMessage());
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 11:57:35