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

如何通过Button将Picker的SelectedItem传递至ViewModel?

问题解决:Picker选中值无法传递到ViewModel的问题

问题根源

你遇到的SelectedYear始终为null的原因是:

  • CollectionView的ItemTemplate是数据模板,模板内的picker是每个列表项的独立实例,外部Button无法通过x:Reference定位到具体的某个picker——模板会为每个Date对象生成一个picker,系统无法确定你要引用哪一个。
  • MAUI绑定系统不支持跨数据模板的元素引用绑定,这直接导致CommandParameter的绑定失效,获取的值始终为null。

正确实现方案

我们需要让Picker的选中项直接绑定到ViewModel的属性,避免跨模板引用的问题。

1. 修改ViewModel

添加SelectedDate属性,并通过其变化回调自动更新SelectedYear:

[QueryProperty("SelectedYear", "SelectedYear")]
public partial class SummaryStatViewModel : BaseViewModel
{
    [ObservableProperty]
    Date selectedDate; // 对应你的model:Date类型

    [ObservableProperty]
    string selectedYear;

    // 当SelectedDate变化时自动更新SelectedYear
    partial void OnSelectedDateChanged(Date value)
    {
        SelectedYear = value?.Year;
    }

    // 你的命令逻辑,直接使用SelectedYear即可
    [RelayCommand]
    void GetSummaryStats()
    {
        // 这里可以直接使用SelectedYear处理业务逻辑
    }
}

2. 修改View中的Picker绑定

让Picker的SelectedItem双向绑定到ViewModel的SelectedDate:

<CollectionView ItemsSource="{Binding Dates}">
    <CollectionView.ItemTemplate>
        <DataTemplate x:DataType="model:Date">
            <VerticalStackLayout>
                <Picker x:Name="picker"
                        ItemsSource="{Binding Source={RelativeSource AncestorType={x:Type viewmodel:SummaryStatViewModel}}, Path=Dates}"
                        ItemDisplayBinding="{Binding Year}"
                        Title="{Binding Year}"
                        TitleColor="White"
                        TextColor="White"
                        BackgroundColor="{StaticResource Gray600}"
                        Opacity="25"
                        HorizontalTextAlignment="Center"
                        FontSize="Medium"
                        Margin="5,5,5,5"
                        SelectedItem="{Binding Source={RelativeSource AncestorType={x:Type viewmodel:SummaryStatViewModel}}, Path=SelectedDate, Mode=TwoWay}">
                </Picker>
                <Border HeightRequest="50" Stroke="Black">
                    <VerticalStackLayout>
                        <Label Text="{Binding Source={x:Reference picker}, Path=SelectedIndex}" TextColor="Black"/>
                        <Label Text="{Binding Source={x:Reference picker}, Path=SelectedItem.Year}" TextColor="Black"/>
                    </VerticalStackLayout>
                </Border>
            </VerticalStackLayout>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

<Button Text="Get Results"
        TextColor="White"
        Grid.Row="1"
        WidthRequest="200"
        BackgroundColor="{StaticResource Primary}"
        BorderColor="Black"
        BorderWidth="1"
        Margin="0,0,0,0"
        Command="{Binding GetSummaryStatsCommand}"/>

关键改动说明

  • 移除了Button的CommandParameter,因为ViewModel的SelectedYear会自动同步Picker的选中值。
  • Picker的SelectedItem通过RelativeSource绑定到ViewModel的SelectedDate,双向绑定确保选中值实时同步到ViewModel。
  • 通过OnSelectedDateChanged回调自动将选中的Date对象的Year赋值给SelectedYear。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:52:51