绑定手势识别器

时间:2018-02-09 01:44:32

标签: c# xml xaml xamarin xamarin.forms

我正在尝试在Xml中绑定一个手势识别器,以便我可以在单击一个项目时进行处理

我尝试将此用于我的XML

<DataTemplate x:Key="TextPostTemplate">
            <ViewCell>
                <StackLayout BackgroundColor="White" Margin="10, 10, 10, 10" Padding="10, 10, 10, 10">
                    <StackLayout Orientation="Horizontal">
                        <Label Text="{Binding Name}" TextColor = "Black" FontSize = "15"/>
                        <Image Source="options_icon.png" HeightRequest="15" HorizontalOptions="EndAndExpand" Margin="0, 0, 10, 0">
                            <Image.GestureRecognizers>
                                <TapGestureRecognizer Tapped="{Binding OptionClick}"/>
                            </Image.GestureRecognizers>
                        </Image>
                    </StackLayout>
                    <Label Text="{Binding Body}" TextColor = "Black"/>
                </StackLayout>
            </ViewCell>
        </DataTemplate>

我尝试将其绑定到

 foreach (var post in posts)
        {
      TapGestureRecognizer optionsClick = new TapGestureRecognizer();
            optionsClick.Tapped += (s, e) =>
            {
                ShowPostOptions(page, navigation, post.id, post.user);
            };
}

和...

OptionClick = optionsClick

但是我得到了

  

.xaml:error:无法将类型为'Xamarin.Forms.Xaml.ElementNode'的对象强制转换为'Xamarin.Forms.Xaml.ValueNode'。

2 个答案:

答案 0 :(得分:2)

你正试图将一个事件绑定到一个命令,然后看起来又回来了,它只是不起作用

<TapGestureRecognizer Tapped="{Binding OptionClick}"/>

如果视图模型中有ICommand,则可以执行此操作

<TapGestureRecognizer Command="{Binding TapCommand}" ...

如果你有一个事件准备进入代码,你可以这样做

public void OnTapGestureRecognizerTappedEvet(Object sender,EventArgs e) 
{
    // code here
}

<TapGestureRecognizer Tapped="OnTapGestureRecognizerTappedEvet" ...

如果您想在代码中完成所有操作

var tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.Tapped += (s, e) => {
    // handle the tap
};
image.GestureRecognizers.Add(tapGestureRecognizer);

Adding a Tap Gesture Gesture Recognizer

答案 1 :(得分:2)

您的代码无效,因为您有效地将TapGestureRecognizer的实例绑定到Tapped事件。您不能对事件进行数据绑定,如果您要设置它,则可以将其设置为事件处理程序而不是TapGestureRecognizer本身的实例。

您有两种选择 - 事件处理程序命令

事件处理程序

在XAML中声明手势识别器,如下所示:

<TapGestureRecognizer Tapped="TappedHandler" />

在页面的代码隐藏中创建一个名为TappedHandler的事件处理程序:

public void TappedHandler(object sender, EventArgs e)
{
   ShowPostOptions(page, navigation, post.id, post.user);
}

命令

在XAML中声明手势识别器,如下所示:

<TapGestureRecognizer Command="{Binding TapCommand}" />

在视图模型中创建一个可以处理点击的命令:

private ICommand _tapCommand;

public ICommand TapCommand => _tapCommand ?? 
     ( _tapCommand = new Command( 
          () => ShowPostOptions(page, navigation, post.id, post.user) ) );