绑定手势识别器

4

我正在尝试在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 : 错误 : 无法将类型为“Xamarin.Forms.Xaml.ElementNode”的对象强制转换为类型“Xamarin.Forms.Xaml.ValueNode”。

2个回答

3
你的代码无法工作,因为你实际上将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) ) );

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接