【问题标题】:Xamarin Form picker using EventToCommandBahavior使用 EventToCommandBahavior 的 Xamarin 表单选择器
【发布时间】:2021-05-24 16:46:14
【问题描述】:

我有一个自定义选择器。我需要在选择器的选择更改时调用 API,并且实现必须仅在 MVVM 中。 DistanceDropdown 是选择器的 x:Name。

<custom:MyPicker.Behaviors>
             <behaviors:EventToCommandBehavior EventName="SelectedIndexChanged"
                                               Command="{Binding Path=BindingContext.DistanceChangedCommand,Source={x:Reference DistanceDropdown}}"></behaviors:EventToCommandBehavior>
   </ccustom:MyPicker.Behaviors>

DistanceChangedCommand 有一个方法

DistanceChangedCommand = new Command<object>(async (x) => await DistanceChangedAction(x as SelectionChangedEventArgs));

方法被命中,但参数为空

private async Task DistanceChangedAction(SelectionChangedEventArgs selectionChangedEventArgs)
        {
            await Task.CompletedTask;
        }

我怎么了?我也试过CommandParameter={Binding}

【问题讨论】:

    标签: c# xamarin.forms mvvm picker xamarin-community-toolkit


    【解决方案1】:

    Picker View 的事件SelectedIndexChanged 具有如下委托处理程序签名:private void Picker_SelectedIndexChanged(object sender, EventArgs e)。所以你的命令应该转换为EventArgs 而不是SelectionChangedEventArgs

    更好的方法是利用CommndParameter

    <Picker x:Name="DistanceDropdown" ...>
     <Picker.Behaviors>
              <xct:EventToCommandBehavior
                      EventName="SelectedIndexChanged"
                      Command="{Binding ItemTappedCommand}"
                      CommandParameter="{Binding Source={x:Reference DistanceDropdown},
                                                 Path=SelectedIndex}"/>
        </Picker.Behaviors>
    

    你会期待一个int类型的参数:

    DistanceChangedCommand = new Command<int>(async (x) => await DistanceChangedAction(x);
    
    private async Task DistanceChangedAction(int selectedIndex)
            {
                await Task.CompletedTask;
                
            }
    

    更好的是,您可以使用AsyncCommand(还附带 Xamarin-Community-Toolkit):

    public ICommand DistanceChangedCommand { get; private set; } 
                                          = new AsyncCommand<int>(selectedIndex
                                                => await Task.CompletedTask);
    

    【讨论】:

    • 如果它回答了您的问题或您觉得它有帮助,请通过upvote ▲/✅ 告诉我,否则您可以给我留下反馈/评论。
    猜你喜欢
    • 2015-12-04
    • 2018-02-02
    • 2018-02-01
    • 2021-01-04
    • 1970-01-01
    • 2021-04-18
    • 2021-12-14
    • 2019-08-30
    • 2019-06-20
    相关资源
    最近更新 更多