简体   繁体   English

Xamarin.Forms - 使用 XAML 元素作为参数

[英]Xamarin.Forms - Use XAML element as a parameter

In my XAML page I have set a Picker.在我的 XAML 页面中,我设置了一个 Picker。 It works good, but it's not very user-friendly, sice there's no possibility to add an arrow icon in the Picker parameters.它工作得很好,但它不是非常用户友好,因为无法在 Picker 参数中添加箭头图标。 So I added an Image with a Gesture Recognizer, like this:所以我添加了一个带有手势识别器的图像,如下所示:

<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>

All I want to do is open the Picker when the down arrow is pressed, so I defined a Command in my ViewModel like that:我要做的就是在按下向下箭头时打开 Picker,所以我在 ViewModel 中定义了一个命令,如下所示:

public Command<Picker> OpenPicker { get; }

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

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

As you can see, I defined the "x:Name" property for my Picker, and I passed this x:Name as my command parameter.如您所见,我为 Picker 定义了“x:Name”属性,并将此 x:Name 作为命令参数传递。 But when I'm launching my app, it throws me a NullReferenceException.但是当我启动我的应用程序时,它会抛出一个 NullReferenceException。

What am I doing wrong?我究竟做错了什么?

By not specifying a Source to your binding, it will go to search for mySlugPicker in your page BindingContext which is your view model and where mySlugPicker does not exist:通过不为您的绑定指定Source ,它将mySlugPicker ,这是您的视图 model 并且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>

A good practice to avoid exception/crash would be to do a null check (don't trust parameter) before calling a method:避免异常/崩溃的一个好做法是在调用方法之前执行 null 检查(不信任参数):

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

which is equivalent to:这相当于:

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

Null-Coditional operator 空条件运算符

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM