【问题标题】:Xamarin.Forms - Use XAML element as a parameterXamarin.Forms - 使用 XAML 元素作为参数
【发布时间】:2021-02-11 22:27:45
【问题描述】:

在我的 XAML 页面中,我设置了一个 Picker。它工作得很好,但它不是非常用户友好,因为无法在 Picker 参数中添加箭头图标。所以我添加了一个带有手势识别器的图像,如下所示:

<Grid HeightRequest="50">
    <Picker x:Name="mySlugPicker" Grid.ColumnSpan="4"  Title="Sélectionnez votre serveur" ItemsSource="{Binding ServerList}"  ItemDisplayBinding="{Binding Value}" SelectedItem="{Binding SelectedItem}" TextColor="Black" TitleColor="Black" BackgroundColor="White"/>
    <Image Grid.Column="4" Source="down_arrow.png">
        <Image.GestureRecognizers>
            <TapGestureRecognizer NumberOfTapsRequired="1" Command="{Binding OpenPicker}" CommandParameter="{Binding mySlugPicker}"/>
        </Image.GestureRecognizers>
    </Image>
</Grid>

我想要做的就是在按下向下箭头时打开 Picker,所以我在 ViewModel 中定义了一个这样的命令:

public Command<Picker> OpenPicker { get; }

public ViewModel()
{
    OpenPicker = new Command<Picker>(TriggerPickerOpening);
}

private void TriggerPickerOpening(Picker picker)
{
    picker.Focus();
}

如您所见,我为 Picker 定义了“x:Name”属性,并将此 x:Name 作为命令参数传递。但是当我启动我的应用程序时,它会抛出一个 NullReferenceException。

我做错了什么?

【问题讨论】:

    标签: c# xaml xamarin.forms


    【解决方案1】:

    通过不为您的绑定指定Source,它将在您的页面BindingContext 中搜索mySlugPicker,这是您的视图模型,而mySlugPicker 不存在:

    <Grid HeightRequest="50">
        <Picker x:Name="mySlugPicker" Grid.ColumnSpan="4"  Title="Sélectionnez votre serveur" ItemsSource="{Binding ServerList}"  ItemDisplayBinding="{Binding Value}" SelectedItem="{Binding SelectedItem}" TextColor="Black" TitleColor="Black" BackgroundColor="White"/>
        <Image Grid.Column="4" Source="down_arrow.png">
            <Image.GestureRecognizers>
                <TapGestureRecognizer NumberOfTapsRequired="1" Command="{Binding OpenPicker}" CommandParameter="{Binding Source={x:Reference mySlugPicker}}"/>
            </Image.GestureRecognizers>
        </Image>
    </Grid>
    

    避免异常/崩溃的一个好习惯是在调用方法之前进行空检查(不信任参数):

    private void TriggerPickerOpening(Picker picker)
    {
        picker?.Focus();
    }
    

    相当于:

    private void TriggerPickerOpening(Picker picker)
    {
        if (picker != null)
            picker.Focus();
    }
    

    Null-Coditional operator

    【讨论】:

    • 对不起,StackOverflow 没有注意到我你的回答 ^^ 是的,它有效!所以“来源”是缺少的元素^^谢谢! :)
    猜你喜欢
    • 2018-02-23
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多