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

.NET Maui CarouselView问题:同步当前项价格至TotalPrice

解决.NET Maui CarouselView选中项同步更新TotalPrice的问题

你当前的核心问题是命令里硬编码了固定索引CarouselViewItems[1],没有追踪CarouselView实际选中的项,导致TotalPrice无法随选中项变化更新。以下是两种简洁的解决方案:


方法一:绑定CurrentItem到ViewModel属性(推荐,MVVM模式更清晰)

1. 修改ViewModel代码

添加CurrentProduct属性,在属性变化时自动更新TotalPrice:

using CarouselVIewDemo.MVVM.Models;
using PropertyChanged;
using System.Collections.ObjectModel;

namespace CarouselVIewDemo.MVVM.ViewModels
{
    [AddINotifyPropertyChangedInterface]
    public class StartPageViewModel
    {
        public ObservableCollection<Product> CarouselViewItems { get; set; } = new();

        public decimal TotalPrice { get; set; }

        private Product _currentProduct;
        public Product CurrentProduct
        {
            get => _currentProduct;
            set
            {
                _currentProduct = value;
                if (_currentProduct != null)
                    TotalPrice = _currentProduct.ProductPrice;
            }
        }

        public StartPageViewModel()
        {                       
            CarouselViewItems = new ObservableCollection<Product>
            {
                new Product
                {
                    ProductId = 1,
                    ProductName = "KaffeBønner",
                    ProductPrice = 35m
                },
                new Product
                {
                    ProductId = 2,
                    ProductName = "LakridsKonfekt",
                    ProductPrice = 55m
                },
                new Product
                {
                    ProductId = 3,
                    ProductName = "Shampoo",
                    ProductPrice = 25m
                },
            };
            // 默认选中第一个产品
            CurrentProduct = CarouselViewItems[0];
        }
    }
}

2. 修改XAML的CarouselView

添加CurrentItem的双向绑定,移除原有的CurrentItemChangedCommand:

<CarouselView
    x:Name="CarouselTest"
    Grid.Row="0"
    Margin="4"
    CurrentItem="{Binding CurrentProduct, Mode=TwoWay}"
    HorizontalOptions="Center"
    IndicatorView="indicatorView"
    ItemsSource="{Binding CarouselViewItems}"
    VerticalOptions="Center">

    <!-- 原有ItemTemplate代码保持不变 -->
</CarouselView>

方法二:通过命令参数获取选中项

1. 修改ViewModel的命令

将命令改为接收选中项参数:

public ICommand CarouselViewItemChanged =>
    new Command<Product>(selectedProduct =>
    {               
        if (selectedProduct != null)
            TotalPrice = selectedProduct.ProductPrice;                                          
    });

2. 修改XAML的CarouselView

给命令传递当前选中项作为参数:

<CarouselView
    x:Name="CarouselTest"
    Grid.Row="0"
    Margin="4"
    CurrentItemChangedCommand="{Binding CarouselViewItemChanged}"
    CurrentItemChangedCommandParameter="{Binding CurrentItem, Source={x:Reference CarouselTest}}"
    HorizontalOptions="Center"
    IndicatorView="indicatorView"
    ItemsSource="{Binding CarouselViewItems}"
    VerticalOptions="Center">

    <!-- 原有ItemTemplate代码保持不变 -->
</CarouselView>

额外注意

你XAML里的Label属性x:Name="{Binding ProductPrice}"是无效的,x:Name不能绑定数据,建议直接删除该行,避免潜在错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:18:12