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

Xamarin Forms中使用MVVM如何仅为CollectionView选中的Frame设置颜色

问题根源

你当前把背景色属性定义在全局的页面ViewModel中,所有CollectionView的Item都绑定了同一个全局属性,所以只要属性变更,所有Item的Frame都会同步变色。要实现单个选中项变色,只需要把选中状态下沉到每个Item对应的数据模型中即可,全程不需要写View后台代码,完全符合MVVM规范。


解决方案

1. 改造Scene数据模型

给每个Item添加独立的背景色属性,并且实现属性变更通知:

public class Scene : INotifyPropertyChanged
{
    // 你原有Scene类的其他属性全部保留
    private Color _backgroundTest = Color.White; // 默认背景色
    public Color BackgroundTest
    {
        get => _backgroundTest;
        set
        {
            if (_backgroundTest == value) return;
            _backgroundTest = value;
            OnPropertyChanged(nameof(BackgroundTest));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

2. 修改页面ViewModel逻辑

删掉原来全局的BackgroundTest、FrameColorChange字段,只操作当前点击的Item属性:

// 单选场景需要额外维护当前选中项的引用,多选场景可以删掉这个字段
private Scene _currentSelectedScene;

private void TriggerScene(Scene scene)
{
    // === 多选逻辑:直接切换当前点击项的颜色 ===
    // scene.BackgroundTest = scene.BackgroundTest == Color.White ? Color.Gray : Color.White;

    // === 单选逻辑:先恢复之前选中项的颜色,再修改当前点击项 ===
    if (_currentSelectedScene != null)
    {
        _currentSelectedScene.BackgroundTest = Color.White;
    }
    if (_currentSelectedScene != scene)
    {
        scene.BackgroundTest = Color.Gray;
        _currentSelectedScene = scene;
    }
    else
    {
        _currentSelectedScene = null; // 点击已选中项时取消选中,不需要可删除
    }
}

3. 调整XAML绑定

DataTemplate内的默认BindingContext就是当前Item对应的Scene实例,直接绑定即可,不需要用RelativeSource绑定到全局ViewModel:

<!-- 可以删掉原来的VisualStateManager配置,避免和绑定逻辑冲突 -->
<Frame  CornerRadius="10"  HasShadow="False" 
        BackgroundColor="{Binding BackgroundTest, Converter={StaticResource colorConverter}}" 
        HeightRequest="75" Margin="5,0,0,0" >

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:18:05